The notebook is more of a visualization workshop using polling data as working examples. It is NOT meant to provide any in-depth political insights, nor is it to draw any solid conclusion on the result of the election.


Prerequisites

Platform

The source data contains traditional Chinese characters encoded in UTF-8. To avoid troublesome encoding issues (especially in a Windows platform with a default CP1252 code page), the codes in this notebook are only tested on Ubuntu and macOS. Codes are in general still working under Windows. Just that some code chunks may not be able to print out unicode characters nicely.

Data

Election Data

We use minimally pre-processed data for our analytics. Please refer to the repo TW_Presidential_Election_2020 for details about the pre-processing logic. To directly download the archives please visit here. We put the uncompressed files under data/processed at our project root directory.

Map Data

For Taiwan map information, the shp file (shapefile) can be downloaded at GADM.org. We put the unzipped files under data/map at our project root directory.

Dependencies

Additional dependencies are required for Linux machine in order to do map plotting. Here is the instruction for Ubuntu.

Install gdal:

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt update
sudo apt install libgdal-dev

Install ubunits:

sudo apt install libudunits2-dev

After installation of the above packages, we can then install and import the following R packages for this project:

library(data.table)

# For viualization.
library(ggplot2)
library(ggrepel)
library(plotly)
library(RColorBrewer)

# Fix macOS ggplot device to locate a Chinese font.
# To make `knitr` aware of this we also need to speficy `fig.showtext=TRUE` for chunks with ggplot output.
library(showtext)
font_add_google("Noto Serif", "noto")
showtext_auto()

# For spatial data visualization.
library(sf)

# For linear modeling with robust std err.
library(lmtest)
library(sandwich)

# To crawl wikipage to get all party representative colors.
library(rvest)

Plotting Devices

We use ggplot2 and plotly throughout the entire notebook. The former is the go-to library for static visualization using R. The latter is a modern interactive visualization framework built on top of d3.js. We can easily convert a static ggplot graph into an interactive plotly graph via the ggplotly API in R. But we can also code directly with the plot_ly API to enjoy all the supported interaction features.

In all the plotting examples we will choose either of the approach, just for fun. Really. :)

References on R Packages

Berger, Susanne, Nathaniel Graham, and Achim Zeileis. 2017. “Various Versatile Variances: An Object-Oriented Implementation of Clustered Covariances in R.” Working Paper 2017-12. Working Papers in Economics; Statistics, Research Platform Empirical; Experimental Economics, Universität Innsbruck. http://EconPapers.RePEc.org/RePEc:inn:wpaper:2017-12.

Dowle, Matt, and Arun Srinivasan. 2019. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.

Neuwirth, Erich. 2014. RColorBrewer: ColorBrewer Palettes. https://CRAN.R-project.org/package=RColorBrewer.

Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.

Qiu, Yixuan, and authors/contributors of the included software. See file AUTHORS for details. 2019. Showtext: Using Fonts More Easily in R Graphs. https://CRAN.R-project.org/package=showtext.

Sievert, Carson. 2018. Plotly for R. https://plotly-r.com.

Slowikowski, Kamil. 2019. Ggrepel: Automatically Position Non-Overlapping Text Labels with ’Gplot2’. https://CRAN.R-project.org/package=ggrepel.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

Zeileis, Achim, and Torsten Hothorn. 2002. “Diagnostic Checking in Regression Relationships.” R News 2 (3): 7–10. https://CRAN.R-project.org/doc/Rnews/.

LS0tCnRpdGxlOiAiVmlzdWFsaXphdGlvbiBmb3IgVFcgR2VuZXJhbCBFbGVjdGlvbiIKc3VidGl0bGU6ICIyMDIwIFByZXNpZGVudGlhbCBhbmQgTGVnaXNsYXRpdmUgUmVzdWx0cyIKYXV0aG9yOgotIG5hbWU6IEt5bGUgQ2h1bmcKICBhZmZpbGlhdGlvbjoKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJWIgJVknKWAgTGFzdCBVcGRhdGVkICgxOSBKYW4gMjAyMCBGaXJzdCBVcGxvYWRlZCkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfd2lkdGg6IDguMzMKICAgIGZpZ19oZWlnaHQ6IDYuMjUKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6IC90bXAvbWV0YV9oZWFkZXIuaHRtbAogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBjb2RlX2Rvd25sb2FkOiB0cnVlCmJpYmxpb2dyYXBoeTogdHdfZWxlY3Rpb25fMjAyMC5iaWIKbm9jaXRlOiB8CiAgQGRhdGEudGFibGUKICBAZ2dwbG90MgogIEBnZ3JlcGVsCiAgQHBsb3RseQogIEBSQ29sb3JCcmV3ZXIKICBAc2hvd3RleHQKICBAc2YKICBAbG10ZXN0CiAgQHNhbmR3aWNoCiAgQHJ2ZXN0CmxpbmstY2l0YXRpb25zOiB5ZXMKYWJzdHJhY3Q6IHwKICBUaGUgbm90ZWJvb2sgcHJvdmlkZXMgYSBuZWFybHktbmV1dHJhbCB2aXN1YWwgZGVzY3JpcHRpb24gb24gdGhlIDIwMjAgVGFpd2FuZXNlIHByZXNpZGVudGlhbCBhbmQgbGVnaXNsYXRpdmUgZWxlY3Rpb24gcmVzdWx0cy4gVGhlIHBvbGxpbmcgdG9vayBwbGFjZSBhdCAyMDIwLTAxLTExIGFuZCBkYXRhIGhhcyBiZWVuIGNvbGxlY3RlZCBieSBDZW50cmFsIEVsZWN0aW9uIENvbW1pc2lvbiAoQ0VDKSBhdCB0aGUgcG9sbGluZyBwbGFjZSBsZXZlbC4KLS0tCgpgYGB7ciBtZXRhLCBpbmNsdWRlPUZBTFNFfQptZXRhX2hlYWRlcl9maWxlIDwtIGZpbGUoIi90bXAvbWV0YV9oZWFkZXIuaHRtbCIpCgojIEFkZCBvcGVuIGdyYXBoIG1ldGEuCm1ldGEgPC0gYygKICAnPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJLeWxlIENodW5nIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6dGl0bGUiIGNvbnRlbnQ9IjIwMjAgVGFpd2FuZXNlIFByZXNpZGVudGlhbCBFbGVjdGlvbiBEYXRhIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6dHlwZSIgY29udGVudD0iYXJ0aWNsZSI+JywKICAnPG1ldGEgcHJvcGVydHk9Im9nOnVybCIgY29udGVudD0iaHR0cHM6Ly9ldmVyZGFyay5naXRodWIuaW8vazkvcHJvamVjdHMvdHdfZWxlY3Rpb25fMjAyMC90d19lbGVjdGlvbl8yMDIwLm5iLmh0bWwiPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzppbWFnZSIgY29udGVudD0iaHR0cHM6Ly9ldmVyZGFyay5naXRodWIuaW8vazkvYXNzZXRzL3R3X2VsZWN0aW9uXzIwMjAucG5nIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGF0YSBzY2llbmNlIG5vdGVib29rIGFib3V0IDIwMjAgVGFpd2FuZXNlIHByZXNpZGVudGlhbCBlbGVjdGlvbi4iPicKKQpjb250ZW50cyA8LSBtZXRhCgojIEFkZCBHaXRodWIgY29ybmVyLgpnaXRodWJfY29ybmVyX3N2ZyA8LSAiLi4vLi4vYXNzZXRzL2dpdGh1Yl9jb3JuZXIuaHRtbCIKZ2l0aHViX2Nvcm5lcl9jb25mIDwtIGxpc3QoZ2l0aHViX2xpbms9Imh0dHBzOi8vZ2l0aHViLmNvbS9ldmVyZGFyay9rOS90cmVlL21hc3Rlci9wcm9qZWN0cy90d19lbGVjdGlvbl8yMDIwIikKY29udGVudHMgPC0gYyhjb250ZW50cywgc3RyaW5ncjo6c3RyX2ludGVycChyZWFkTGluZXMoZ2l0aHViX2Nvcm5lcl9zdmcpLCBnaXRodWJfY29ybmVyX2NvbmYpKQp3cml0ZUxpbmVzKGNvbnRlbnRzLCBtZXRhX2hlYWRlcl9maWxlKQoKY2xvc2UobWV0YV9oZWFkZXJfZmlsZSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5hbGlnbj0iY2VudGVyIikKCiMgQ3VycmVudCBpc3N1ZXM6CiMgMS4gZmlnLmNhcCBkb2Vzbid0IHNlZW0gdG8gd29yayBmb3IgcGxvdGx5IHVuZGVyIGh0bWwgbm90ZWJvb2suIChXb3JrcyBmb3IgcHVyZSBodG1sIHRob3VnaC4pCiMKIyAyLiBwbG90bHkgd2l0aCBsb25nLWVub3VnaCB1bmljb2RlIGNoYXJhY3RlcnMgd2lsbCBjYXVzZSB0aGUgcmVuZGVyaW5nIGZhaWxlZC4KIyAgICBBIHdvcmthcm91bmQgaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlIHJlbmRlciBzY3JpcHQuCiMgICAgaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vcm1hcmtkb3duL2lzc3Vlcy8xNzYyCiMgMy4gcm1hcmtkb3duIDIuMCBjYW5ub3QgcmVuZXIgY2l0YXRpb24gZm9yIGh0bWwgbm90ZWJvb2suIFRoaXMgaXMgZml4ZWQgaW4gdGhlIGN1cnJlbnQgZGV2LgpgYGAKCi0tLQoKKipUaGUgbm90ZWJvb2sgaXMgbW9yZSBvZiBhIHZpc3VhbGl6YXRpb24gd29ya3Nob3AgdXNpbmcgcG9sbGluZyBkYXRhIGFzIHdvcmtpbmcgZXhhbXBsZXMuKioKKipJdCBpcyBOT1QgbWVhbnQgdG8gcHJvdmlkZSBhbnkgaW4tZGVwdGggcG9saXRpY2FsIGluc2lnaHRzLCoqCioqbm9yIGlzIGl0IHRvIGRyYXcgYW55IHNvbGlkIGNvbmNsdXNpb24gb24gdGhlIHJlc3VsdCBvZiB0aGUgZWxlY3Rpb24uKioKCi0tLQoKIyBQcmVyZXF1aXNpdGVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMgUGxhdGZvcm0KClRoZSBzb3VyY2UgZGF0YSBjb250YWlucyB0cmFkaXRpb25hbCBDaGluZXNlIGNoYXJhY3RlcnMgZW5jb2RlZCBpbiBVVEYtOC4KVG8gYXZvaWQgdHJvdWJsZXNvbWUgZW5jb2RpbmcgaXNzdWVzIChlc3BlY2lhbGx5IGluIGEgV2luZG93cyBwbGF0Zm9ybSB3aXRoIGEgZGVmYXVsdCBgQ1AxMjUyYCBjb2RlIHBhZ2UpLAp0aGUgKipjb2RlcyBpbiB0aGlzIG5vdGVib29rIGFyZSBvbmx5IHRlc3RlZCBvbiBVYnVudHUgYW5kIG1hY09TLioqCkNvZGVzIGFyZSBpbiBnZW5lcmFsIHN0aWxsIHdvcmtpbmcgdW5kZXIgV2luZG93cy4KSnVzdCB0aGF0IHNvbWUgY29kZSBjaHVua3MgbWF5IG5vdCBiZSBhYmxlIHRvIHByaW50IG91dCB1bmljb2RlIGNoYXJhY3RlcnMgbmljZWx5LgoKIyMgRGF0YQoKIyMjIEVsZWN0aW9uIERhdGEgey19CgpXZSB1c2UgbWluaW1hbGx5IHByZS1wcm9jZXNzZWQgZGF0YSBmb3Igb3VyIGFuYWx5dGljcy4KUGxlYXNlIHJlZmVyIHRvIHRoZSByZXBvIFtUV19QcmVzaWRlbnRpYWxfRWxlY3Rpb25fMjAyMF0oaHR0cHM6Ly9naXRodWIuY29tL2V2ZXJkYXJrL1RXX1ByZXNpZGVudGlhbF9FbGVjdGlvbl8yMDIwKSBmb3IgZGV0YWlscyBhYm91dCB0aGUgcHJlLXByb2Nlc3NpbmcgbG9naWMuClRvIGRpcmVjdGx5IGRvd25sb2FkIHRoZSBhcmNoaXZlcyBwbGVhc2UgdmlzaXQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9ldmVyZGFyay9UV19QcmVzaWRlbnRpYWxfRWxlY3Rpb25fMjAyMC9yZWxlYXNlcy9sYXRlc3QpLgpXZSBwdXQgdGhlIHVuY29tcHJlc3NlZCBmaWxlcyB1bmRlciBgZGF0YS9wcm9jZXNzZWRgIGF0IG91ciBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgoKIyMjIE1hcCBEYXRhIHstfQoKRm9yIFRhaXdhbiBtYXAgaW5mb3JtYXRpb24sCnRoZSBgc2hwYCBmaWxlIChbc2hhcGVmaWxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaGFwZWZpbGUpKSBjYW4gYmUgZG93bmxvYWRlZCBhdCBbR0FETS5vcmddKGh0dHBzOi8vZ2FkbS5vcmcvZG93bmxvYWRfY291bnRyeV92My5odG1sKS4KV2UgcHV0IHRoZSB1bnppcHBlZCBmaWxlcyB1bmRlciBgZGF0YS9tYXBgIGF0IG91ciBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgoKIyMgRGVwZW5kZW5jaWVzCgpBZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBhcmUgcmVxdWlyZWQgZm9yIExpbnV4IG1hY2hpbmUgaW4gb3JkZXIgdG8gZG8gbWFwIHBsb3R0aW5nLgpIZXJlIGlzIHRoZSBpbnN0cnVjdGlvbiBmb3IgVWJ1bnR1LgoKSW5zdGFsbCBbYGdkYWxgXShodHRwczovL2dkYWwub3JnLyk6CgpgYGBzaApzdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6dWJ1bnR1Z2lzL3VidW50dWdpcy11bnN0YWJsZQpzdWRvIGFwdCB1cGRhdGUKc3VkbyBhcHQgaW5zdGFsbCBsaWJnZGFsLWRldgpgYGAKCkluc3RhbGwgYHVidW5pdHNgOgoKYGBgc2gKc3VkbyBhcHQgaW5zdGFsbCBsaWJ1ZHVuaXRzMi1kZXYKYGBgCgpBZnRlciBpbnN0YWxsYXRpb24gb2YgdGhlIGFib3ZlIHBhY2thZ2VzLAp3ZSBjYW4gdGhlbiBpbnN0YWxsIGFuZCBpbXBvcnQgdGhlIGZvbGxvd2luZyBSIHBhY2thZ2VzIGZvciB0aGlzIHByb2plY3Q6CgpgYGB7ciBpbXBvcnQsIHJlc3VsdHM9ImhpZGUiLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjbGFzcy5zb3VyY2U9ImZvbGQtc2hvdyJ9CmxpYnJhcnkoZGF0YS50YWJsZSkKCiMgRm9yIHZpdWFsaXphdGlvbi4KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKCiMgRml4IG1hY09TIGdncGxvdCBkZXZpY2UgdG8gbG9jYXRlIGEgQ2hpbmVzZSBmb250LgojIFRvIG1ha2UgYGtuaXRyYCBhd2FyZSBvZiB0aGlzIHdlIGFsc28gbmVlZCB0byBzcGVmaWN5IGBmaWcuc2hvd3RleHQ9VFJVRWAgZm9yIGNodW5rcyB3aXRoIGdncGxvdCBvdXRwdXQuCmxpYnJhcnkoc2hvd3RleHQpCmZvbnRfYWRkX2dvb2dsZSgiTm90byBTZXJpZiIsICJub3RvIikKc2hvd3RleHRfYXV0bygpCgojIEZvciBzcGF0aWFsIGRhdGEgdmlzdWFsaXphdGlvbi4KbGlicmFyeShzZikKCiMgRm9yIGxpbmVhciBtb2RlbGluZyB3aXRoIHJvYnVzdCBzdGQgZXJyLgpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKCiMgVG8gY3Jhd2wgd2lraXBhZ2UgdG8gZ2V0IGFsbCBwYXJ0eSByZXByZXNlbnRhdGl2ZSBjb2xvcnMuCmxpYnJhcnkocnZlc3QpCmBgYAoKIyMgUGxvdHRpbmcgRGV2aWNlcwoKV2UgdXNlIFtgZ2dwbG90MmBdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnKSBhbmQgW2BwbG90bHlgXShodHRwczovL3Bsb3QubHkvKSB0aHJvdWdob3V0IHRoZSBlbnRpcmUgbm90ZWJvb2suClRoZSBmb3JtZXIgaXMgdGhlIGdvLXRvIGxpYnJhcnkgZm9yIHN0YXRpYyB2aXN1YWxpemF0aW9uIHVzaW5nIFIuClRoZSBsYXR0ZXIgaXMgYSBtb2Rlcm4gaW50ZXJhY3RpdmUgdmlzdWFsaXphdGlvbiBmcmFtZXdvcmsgYnVpbHQgb24gdG9wIG9mIGBkMy5qc2AuCldlIGNhbiBlYXNpbHkgY29udmVydCBhIHN0YXRpYyBgZ2dwbG90YCBncmFwaCBpbnRvIGFuIGludGVyYWN0aXZlIGBwbG90bHlgIGdyYXBoIHZpYSB0aGUgYGdncGxvdGx5YCBBUEkgaW4gUi4KQnV0IHdlIGNhbiBhbHNvIGNvZGUgZGlyZWN0bHkgd2l0aCB0aGUgYHBsb3RfbHlgIEFQSSB0byBlbmpveSBhbGwgdGhlIHN1cHBvcnRlZCBpbnRlcmFjdGlvbiBmZWF0dXJlcy4KCkluIGFsbCB0aGUgcGxvdHRpbmcgZXhhbXBsZXMgd2Ugd2lsbCBjaG9vc2UgZWl0aGVyIG9mIHRoZSBhcHByb2FjaCwKanVzdCBmb3IgZnVuLgpSZWFsbHkuIDopCgojIEJhY2tncm91bmQKCisgWzIwMjAgMTV0aCBUYWl3YW5lc2UgUHJlc2lkZW50aWFsIEVsZWN0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8yMDIwX1RhaXdhbmVzZV9wcmVzaWRlbnRpYWxfZWxlY3Rpb24pCisgWzIwMjAgMTB0aCBUYWl3YW5lc2UgTGVnaXNsYXRpdmUgRWxlY3Rpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzIwMjBfVGFpd2FuZXNlX2xlZ2lzbGF0aXZlX2VsZWN0aW9uKQoKIyBWaXN1YWwgQW5hbHl0aWNzIG9uIEVsZWN0aW9uIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHMgI2hlYWR9CgojIyDnrKzljYHkupTlsYbnuL3ntbHpgbjoiInntZDmnpwgVGhlIDE1dGggUHJlc2lkZW50aWFsIEVsZWN0aW9uIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMg5pyJ5pWI56WoIFZhbGlkIFZvdGUgQ291bnRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IgcGFyc2VfdHdfY291bnR5X21hcH0KIyBSZWFkIHNoYXBlZmlsZSBmb3Igc3BhdGlhbCBpbmZvcm1hdGlvbiBhYm91dCBjb3VudGllcyBpbiBUYWl3YW4uCnR3X2NvdW50eV9zZiA8LSBzZjo6c3RfcmVhZCgiZGF0YS9tYXAvZ2FkbTM2X1RXTl8yLnNocCIsIHF1aWV0PVRSVUUpCgojIEFsaWduIGNvdW50eSBuYW1pbmcuCnR3X2NvdW50eV9zZiROTF9OQU1FXzIgPC0gZ3N1Yigi5Y+w5LitIiwgIuWPsOS4reW4giIsIHR3X2NvdW50eV9zZiROTF9OQU1FXzIpCnR3X2NvdW50eV9zZiROTF9OQU1FXzIgPC0gZ3N1Yigi5Y+w5Y2XIiwgIuWPsOWNl+W4giIsIHR3X2NvdW50eV9zZiROTF9OQU1FXzIpCnR3X2NvdW50eV9zZiROTF9OQU1FXzIgPC0gZ3N1Yigi6aas56WW5YiX5bO2IiwgIumAo+axn+e4oyIsIHR3X2NvdW50eV9zZiROTF9OQU1FXzIpCmBgYAoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfY291bnR5LCByZXN1bHRzPSJoaWRlIn0KIyBwcm9jZXNzIGNvdW50eS1sZXZlbCBwcmVzaWRlbnRpYWwgZWxlY3Rpb24gcmVzdWx0cy4KcF9jb3VudHkgPC0gZnJlYWQoImRhdGEvcHJvY2Vzc2VkL3ByZXNpZGVudGlhbC9wcmVzaWRlbnRpYWxfY291bnRpZXMuY3N2IiwgZW5jb2Rpbmc9IlVURi04IikKcF9jb3VudHkgPC0gcF9jb3VudHlbLCBSZWdpb246PXRyaW13cyhSZWdpb24sIHdoaXRlc3BhY2U9IltcXGhcXHZdIildICAjIFRyaW0gZnVsbC13aWR0aCB3aGl0ZSBzcGFjZS4KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBSZWdpb246PWdzdWIoIuiHuiIsICLlj7AiLCBSZWdpb24pXSAgIyBBbGlnbiBjaGFyYWN0ZXIgd2l0aCBzaGFwZWZpbGUuCnNldG5hbWVzKHBfY291bnR5LCAi5oqV56Wo546HSCBIPUPDt0ciLCAiVHVybm91dCIpCgojIEZpbmFsIGNvdW50cy4KY29sc19jYW5kaWRhdGUgPC0gYygiKDEpIOWui+almueRnCDkvZnmuZgiLCAiKDIpIOmfk+Wci+eRnCDlvLXlloTmlL8iLCAiKDMpIOiUoeiLseaWhyDos7TmuIXlvrciKQpwX2ZpbmFsIDwtIGFzLmRhdGEudGFibGUoY29sU3VtcyhwX2NvdW50eVssIGNvbHNfY2FuZGlkYXRlLCB3aXRoPUZBTFNFXSksIGtlZXAucm93bmFtZXM9VFJVRSkKc2V0bmFtZXMocF9maW5hbCwgYygiQ2FuZGlkYXRlIiwgIlZvdGVzIikpCnBfZmluYWwgPC0gcF9maW5hbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCgojIE1lcmdlIHdpdGggc2hwIHRvIGdldCBFbmdsaXNoIGNvdW50eSBuYW1lLgpwX2NvdW50eSA8LSBtZXJnZShwX2NvdW50eSwgdHdfY291bnR5X3NmWywgYygiTkxfTkFNRV8yIiwgIk5BTUVfMiIpXSwKICAgICAgICAgICAgICAgICAgYnkueT0iTkxfTkFNRV8yIiwgYnkueD0iUmVnaW9uIikKcF9jb3VudHkkZ2VvbWV0cnkgPC1OVUxMCnNldG5hbWVzKHBfY291bnR5LCAiTkFNRV8yIiwgIlJlZ2lvbkVuIikKcF9jb3VudHkgPC0gcF9jb3VudHlbLCBDb3VudHk6PXBhc3RlKFJlZ2lvbiwgUmVnaW9uRW4pXQoKIyBNZWx0IGZyb20gd2lkZSB0byBsb25nIGZvciBwbG90dGluZyBwdXJwb3NlLgpjb2xzX3JlZ2lvbiA8LSBjKCJDb3VudHkiLCAiUmVnaW9uIiwgIlJlZ2lvbkVuIikKcF9jb3VudHlfbCA8LSBtZWx0KHBfY291bnR5WywgYyhjb2xzX3JlZ2lvbiwgY29sc19jYW5kaWRhdGUpLCB3aXRoPUZBTFNFXSwKICAgICAgICAgICAgICAgICAgIGlkLnZhcnM9Y29sc19yZWdpb24sIHZhcmlhYmxlLm5hbWU9IkNhbmRpZGF0ZSIsIHZhbHVlLm5hbWU9IlZvdGVzIikKcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sWywgQ2FuZGlkYXRlOj1mYWN0b3IoQ2FuZGlkYXRlKV0gICMgTGV2ZWwgYnkgY2FuZGlkYXRlIG51bWJlci4KCiMgQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gRFBQIGFuZCBLTVQgYnkgY291bnR5LgpzZXRvcmRlcihwX2NvdW50eV9sLCBDb3VudHksIENhbmRpZGF0ZSkKcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sWywgVm90ZXNfRGlmZjo9Vm90ZXNbM10gLSBWb3Rlc1syXSwgYnk9LihDb3VudHkpXQoKIyBDb21wdXRlIHRvdGFsIHZvdGVzIGJ5IGNvdW50eS4KcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sWywgVG90YWxfVm90ZXM6PXN1bShWb3RlcyksIGJ5PS4oQ291bnR5KV0KCiMgQ29tcHV0ZSBzaGFyZSBieSBjb3VudHkuCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFZvdGVzX1NoYXJlOj1Wb3RlcyAvIFRvdGFsX1ZvdGVzXQpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbLCBTaGFyZV9EaWZmOj1Wb3Rlc19TaGFyZVszXSAtIFZvdGVzX1NoYXJlWzJdLCBieT0uKENvdW50eSldCnBfY291bnR5X2RpZmYgPC0gdW5pcXVlKHBfY291bnR5X2wsIGJ5PSJDb3VudHkiKVsKICAsIGMoY29sc19yZWdpb24sICJUb3RhbF9Wb3RlcyIsICJTaGFyZV9EaWZmIiksIHdpdGg9RkFMU0VdCnBfY291bnR5X2RpZmYgPC0gcF9jb3VudHlfZGlmZlssIGRwcF93aW46PVNoYXJlX0RpZmYgPiAwXQoKIyBKb2luIHNoYXJlIGRpZmYgdG8gc3BhdGlhbCBkYXRhZnJhbWUuCnR3X2NvdW50eV9zZiA8LSBtZXJnZSh0d19jb3VudHlfc2YsIHBfY291bnR5X2RpZmYsIGJ5Lng9Ik5MX05BTUVfMiIsIGJ5Lnk9IlJlZ2lvbiIpCgojIEpvaW4gdHVybm91dCB0byBzcGF0aWFsIGRhdGFmcmFtZS4KdHdfY291bnR5X3NmIDwtIG1lcmdlKHR3X2NvdW50eV9zZiwgcF9jb3VudHlbLCAuKFJlZ2lvbiwgVHVybm91dCldLCBieS54PSJOTF9OQU1FXzIiLCBieS55PSJSZWdpb24iKQoKIyBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBEUFAgYW5kIEtNVCBvbiB0aGUgd2lkZSBkYXRhIGFzIHdlbGwuCnBfY291bnR5IDwtIHBfY291bnR5WywgVm90ZV9EaWZmOj1nZXQoIigzKSDolKHoi7Hmlocg6LO05riF5b63IikgLSBnZXQoIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IildCnBfY291bnR5IDwtIHBfY291bnR5WywgU2hhcmVfRGlmZjo9Vm90ZV9EaWZmIC8gZ2V0KCLmnInmlYjnpajmlbhBIEE9MSsyKy4uLitOIildCgojIENvbG9yIGNvbmZpZ3VyYXRpb24gZm9yIG1haW4gcGFydGllcy4KbWFpbl9wYXJ0eV9jb2xvcnMgPC0gYygiZGFya29yYW5nZSIsICJkb2RnZXJibHVlIiwgImdyZWVuMyIpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2ZpbmFsX3Jlc3VsdCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9NCwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gRmluYWwgT3V0Y29tZSJ9CmdncGxvdChwX2ZpbmFsLCBhZXMoeD1DYW5kaWRhdGUsIHk9Vm90ZXMsIGZpbGw9Q2FuZGlkYXRlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoeD0i5YCZ6YG45Lq6IiwgeT0i5b6X56Wo5pW4IiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG457WQ5p6cIikgKwogIGdlb21fdGV4dChhZXMoeD1DYW5kaWRhdGUsIHk9Vm90ZXMgLyAyLAogICAgICAgICAgICAgICAgbGFiZWw9c3ByaW50ZigiJXNcbiglcykiLCBzY2FsZXM6OmNvbW1hKFZvdGVzKSwgc2NhbGVzOjpwZXJjZW50KFNoYXJlKSkpLAogICAgICAgICAgICBzaXplPTUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyMjIyBCeSBDb3VudHkg5L6d57ij5biCCgpUaGUgcHJlLXByb2Nlc3NlZCBjb3VudHkgcmVzdWx0IGZvciBwcmVzaWRlbnRpYWwgZWxlY3Rpb24gaXMgYSAqd2lkZSogZm9ybWF0IGJ5IGNvdW50eToKCmBgYHtyIHNob3dfcHJlc2lkZW50aWFsX2NvdW50eV9yZXN1bHR9CmhlYWQocF9jb3VudHlbLCAtYygxOjMpXSkKYGBgCgpBbmQgd2UndmUgcmVzaGFwZWQgaXQgaW50byBhICpsb25nKiBmb3JtYXQgZm9yIGVhc2Ugb2YgcGxvdHRpbmc6CgpgYGB7ciBzaG93X3ByZXNpZGVudGlhbF90YWllcGl9CiMgU2hvdyByZXN1bHQgZm9yIFRhaXBlaS4KcF9jb3VudHlfbFtSZWdpb24gPT0gIuWPsOWMl+W4giJdCmBgYAoKUGxvdCB2b3RlIGNvdW50cyBieSBjb3VudHk6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X2JhciwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZSBDb3VudHMgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocF9jb3VudHlfbCwgYWVzKHg9cmVvcmRlcihDb3VudHksIFRvdGFsX1ZvdGVzKSwgeT1Wb3RlcywgZmlsbD1DYW5kaWRhdGUpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0iZG9kZ2UiLCB3aWR0aD0uOCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWU9IuWAmemBuOS6uiIsIHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpjb21tYSkgKwogIGxhYnMoeD0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiwgeT0i5b6X56Wo5pW4IiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45YCZ6YG45Lq65ZCE57ij5biC77ya5b6X56Wo5pW4IikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKClRob3VnaCBpdCdzIGNvbnZlbmllbnQgdG8gY29udmVydCBhIGBnZ3Bsb3RgIGludG8gYHBsb3RseWAgd2l0aCBhIHNpbmdsZSBjYWxsIG9mIGBnZ3Bsb3RseWAsCnNvbWUgbmljZSBpbnRlcmFjdGlvbiBmZWF0dXJlcyB3b24ndCBiZSBzdXBwb3J0ZWQuCkZvciBleGFtcGxlIHRvIGludGVyYWN0IHdpdGggc3RhY2tlZCBiYXJzIGEgbmF0aXZlIGBwbG90bHlgIG91dHB1dCBjYW4gYmUgbmljZXIgc2luY2UgaXQgd2lsbCAqcmUtc3RhY2sqIHRoZSBiYXIgZm9yIGdyb3VwcyB0aGF0IGFyZSBub3QgZGlzYWJsZWQgYnkgdXNlciBjbGlja3M6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X2Jhcl9wbG90bHksIGZnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZSBDb3VudHMgYnkgQ291bnR5In0KIyBMZXQncyB0cnkgdGhlIG5hdGl2ZSBwbG90bHkgYXMgd2VsbC4KIyBTb21lIG5pY2UgaW50ZXJhY3Rpb24gb25seSB3b3JrcyB3aGVuIHRoZSBwbG90IGlzIGNvbnN0cnVjdGVkIGJ5IHRoZSBuYXRpdmUgQVBJLgpwbG90X2x5KHBfY291bnR5X2wsIHk9fnJlb3JkZXIoQ291bnR5LCBUb3RhbF9Wb3RlcyksIHg9flZvdGVzLAogICAgICAgIHR5cGU9ImJhciIsICBvcmllbnRhdGlvbj0iaCIsCiAgICAgICAgY29sb3I9fkNhbmRpZGF0ZSwgY29sb3JzPW1haW5fcGFydHlfY29sb3JzLAogICAgICAgIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkgJT4lCiAgbGF5b3V0KGJhcm1vZGU9InN0YWNrIiwKICAgICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlgJnpgbjkurrlkITnuKPluILvvJrlvpfnpajmlbgiLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSLnuKPluILvvIjkvp3nuL3npajmlbjmjpLluo/vvIkiKSwKICAgICAgICAgeGF4aXM9bGlzdCh0aXRsZT0i5b6X56Wo5pW4IiksCiAgICAgICAgIG1hcmdpbj1saXN0KHQ9NTApKQpgYGAKCkFuZCBhbHNvIHZvdGUgc2hhcmVzICh2b3RlIGNvdW50cyAvIHRvdGFsIHZhbGlkIHZvdGVzKToKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyX3BjdCwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZSBTaGFyZXMgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocF9jb3VudHlfbCwgYWVzKHg9cmVvcmRlcihDb3VudHksIFRvdGFsX1ZvdGVzKSwgeT1Wb3Rlc19TaGFyZSwgZmlsbD1DYW5kaWRhdGUpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siLCB3aWR0aD0uOCkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFZvdGVzX1NoYXJlKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0i5YCZ6YG45Lq6IiwgdmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3nuL3npajmlbjmjpLluo/vvIkiLCB5PSLlvpfnpajnjociLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlgJnpgbjkurrlkITnuKPluILvvJrlvpfnpajnjociKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKU2luY2UgdGhlIG1haW4gcGFydGllcyBhcmUgRERQIGFuZCBLTVQsCndlIGRlZmluZSB2b3RlIHNoYXJlIGRpZmZlcmVuY2UgYXMgdm90ZSBzaGFyZSBvZiBERFAgbWludXMgdGhhdCBvZiBLTVQuClRoZSBmb2xsb3dpbmcgYmFycGxvdCBnaXZlcyB1cyBhIGNsZWFyIHZpZXcgb2Ygd2hpY2ggY291bnR5IERQUCB3b24gdGhlIG1vc3QuCgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X2Jhcl9wY3RfZGlmZiwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZSBTaGFyZSBEaWZmZXJlbmNlIChEUFAncyAtIEtNVCdzKSBieSBDb3VudHkifQpwIDwtIGdncGxvdChwX2NvdW50eV9kaWZmLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgU2hhcmVfRGlmZiksIGZpbGw9ZHBwX3dpbiwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRvZGdlcmJsdWUiLCAiZ3JlZW4zIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lvpfnpajnjoflt67mjpLluo/vvIkiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKV2UgY2FuIGFsc28gdmlzdWFsaXplIHRoZSBhYm92ZSByYW5raW5nIHdpdGggYSBjaG9yb3BsZXRoIG1hcDoKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfbWFwLCBmaWcuY2FwPSJDaG9yb3BsZXRoIE1hcCBmb3IgVm90ZSBTaGFyZSBEaWZmZXJlbmNlcyAoRFBQJ3MgLSBLTVQncykifQpwIDwtIGdncGxvdCh0d19jb3VudHlfc2YsIGFlcyh0ZXh0PUNvdW50eSkpICsKICBnZW9tX3NmKGFlcyhmaWxsPVNoYXJlX0RpZmYpKSArCiAgY29vcmRfc2YoeGxpbT1jKDExOCwgMTIyLjUpLCB5bGltPWMoMjEuNSwgMjYuNSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KG5hbWU9Iue2oOiXjeW+l+elqOeOh+W3riIsIGxvdz0iYmx1ZTMiLCBoaWdoPSJncmVlbjMiKSArCiAgbGFicyh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8mue2oOiXjeW+l+elqOeOh+W3riIpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKQXBwYXJlbnRseSBEUFAgd29uIG1vc3QgY291bnRpZXMgYmVzaWRlcyBtYWludGFpbiBhbmQgb3V0bHlpbmcgaXNsYW5kIGFyZWFzLgoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgQ291bnR5IFN1Yi1SZWdpb24g5L6d6YSJ6Y6u5biC5Y2AIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfcmVnaW9uLCByZXN1bHRzPSJoaWRlIn0KIyBSZWFkIGNvdW50eSBzdWJyZWdpb24tbGV2ZWwgcHJlc2lkZW50aWFsIGVsZWN0aW9uIHJlc3VsdHMuCnBfcmVnaW9uIDwtIGZyZWFkKCJkYXRhL3Byb2Nlc3NlZC9wcmVzaWRlbnRpYWwvcHJlc2lkZW50aWFsX3JlZ2lvbnMuY3N2IiwgZW5jb2Rpbmc9IlVURi04IikKcF9yZWdpb24gPC0gcF9yZWdpb25bLCBSZWdpb246PXRyaW13cyhSZWdpb24sIHdoaXRlc3BhY2U9IltcXGhcXHZdIildICAjIFRyaW0gZnVsbC13aWR0aCB3aGl0ZSBzcGFjZS4Kc2V0bmFtZXMocF9yZWdpb24sICLmipXnpajnjodIIEg9Q8O3RyIsICJUdXJub3V0IikKCiMgQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gRFBQIGFuZCBLTVQgYnkgcmVnaW9uLgpwX3JlZ2lvbiA8LSBwX3JlZ2lvblssIFZvdGVfRGlmZjo9Z2V0KCIoMykg6JSh6Iux5paHIOiztOa4heW+tyIpIC0gZ2V0KCIoMikg6Z+T5ZyL55GcIOW8teWWhOaUvyIpXQpwX3JlZ2lvbiA8LSBwX3JlZ2lvblssIFNoYXJlX0RpZmY6PVZvdGVfRGlmZiAvIGdldCgi5pyJ5pWI56Wo5pW4QSBBPTErMisuLi4rTiIpXQoKIyBXaWRlIHRvIGxvbmcuCnBfcmVnaW9uX2wgPC0gbWVsdChwX3JlZ2lvblssIGMoIkJ5IiwgIlJlZ2lvbiIsIGNvbHNfY2FuZGlkYXRlKSwgd2l0aD1GQUxTRV0sCiAgICAgICAgICAgICAgICAgICBpZC52YXJzPWMoIkJ5IiwgIlJlZ2lvbiIpLCB2YXJpYWJsZS5uYW1lPSJDYW5kaWRhdGUiLCB2YWx1ZS5uYW1lPSJWb3RlcyIpCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFssIENhbmRpZGF0ZTo9ZmFjdG9yKENhbmRpZGF0ZSldICAjIExldmVsIGJ5IGNhbmRpZGF0ZSBudW1iZXIuCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFtwX3JlZ2lvbiwgU2hhcmVfRGlmZjo9aS5TaGFyZV9EaWZmLCBvbj0uKFJlZ2lvbildCgpzZXRvcmRlcihwX3JlZ2lvbiwgLVNoYXJlX0RpZmYpCgojIEdyb3VwIGNvdW50aWVzIGludG8gYXJlYXMuCm5vcnRoX2NvdW50aWVzIDwtIGMoIuiHuuWMl+W4giIsICLmlrDljJfluIIiLCAi5Z+66ZqG5biCIiwgIuaWsOerueW4giIsICLmoYPlnJLluIIiLCAi5paw56u557ijIiwgIuWunOiYree4oyIpCmNlbnRyYWxfY291bnRpZXMgPC0gYygi6Ie65Lit5biCIiwgIuiLl+agl+e4oyIsICLlvbDljJbnuKMiLCAi5Y2X5oqV57ijIiwgIumbsuael+e4oyIpCnNvdXRoX2NvdW50aWVzIDwtIGMoIumrmOmbhOW4giIsICLoh7rljZfluIIiLCAi5ZiJ576p5biCIiwgIuWYiee+qee4oyIsICLlsY/mnbHnuKMiLCAi5r6O5rmW57ijIikKZWFzdF9jb3VudGllcyA8LSBjKCLoirHok67nuKMiLCAi6Ie65p2x57ijIikKaXNsYW5kX2NvdW50aWVzIDwtIGMoIumHkemWgOe4oyIsICLpgKPmsZ/nuKMiKQoKIyBIZWxwZXIgZnVuY3Rpb24gZm9yIHNoYXJlIGRpZmZlcmVuY2UgYmFyIHBsb3QuCnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYgPC0gZnVuY3Rpb24oY291bnRpZXMsIHRpdGxlKSB7CiAgRFQgPC0gcF9yZWdpb25bQnkgJWluJSBjb3VudGllc10KICBEVFssIEJ5Oj1mYWN0b3IoQnksIGxldmVscz1jb3VudGllcyldICAjIEZpeCBvcmRlciBmb3IgZmFjZXQgZ3JpZHMuCiAgRFRbLCBSZWdpb24yOj1wYXN0ZShCeSwgUmVnaW9uKV0gICMgRml4ZWQgb3JkZXIgd2l0aGluIGZhY2V0IChzYW1lLW5hbWUgcmVnaW9uIGZvciBkaWZmZXJlbnQgY291bnRpZXMpLgogIERUWywgZHBwX3dpbjo9U2hhcmVfRGlmZiA+IDBdCiAgcCA8LSBnZ3Bsb3QoRFQsIGFlcyh4PXJlb3JkZXIoUmVnaW9uMiwgU2hhcmVfRGlmZiksIHk9U2hhcmVfRGlmZiwgZmlsbD1kcHBfd2luKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgY29sb3I9ImJsYWNrIiwgYWxwaGE9LjUpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJkb2RnZXJibHVlIiwgImdyZWVuMyIpKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChTaGFyZV9EaWZmKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICAgIGxhYnMoeD0iIiwgeT0iIiwgdGl0bGU9dGl0bGUpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBmYWNldF9ncmlkKEJ5IH4gLiwgc2NhbGVzPSJmcmVlX3kiLCBzcGFjZT0iZnJlZV95IikKICBwCn0KYGBgCgpWb3RlIHNoYXJlIGRpZmZlcmVuY2UgKERQUCB2LnMuIEtNVCkgcmFua2VkIGJ5IHJlZ2lvbiBhY3Jvc3MgdGhlIG5hdGlvbjoKCmBgYHtyIHNoYXJlX2RpZmZfcmFua19ieV9yZWdpb259CnBfcmVnaW9uX3JhbmsgPC0gcF9yZWdpb25bLCAuKEJ5LCBSZWdpb24sIFNoYXJlX0RpZmYsIFZvdGVfRGlmZildCnBfcmVnaW9uX3JhbmsgPC0gcF9yZWdpb25fcmFua1ssIFNoYXJlX0RpZmY6PXNjYWxlczo6cGVyY2VudChTaGFyZV9EaWZmLCAuMDAxKV0KcF9yZWdpb25fcmFuayA8LSBwX3JlZ2lvbl9yYW5rWywgaTo9LkldCnNldGNvbG9yZGVyKHBfcmVnaW9uX3JhbmssICJpIikKc2V0bmFtZXMocF9yZWdpb25fcmFuaywgYygi5o6S5bqPIiwgIue4o+W4giIsICLphInpjq7luILljYAiLCAi57ag6JeN5b6X56Wo546H5beuIiwgIue2oOiXjeW+l+elqOaVuOW3riIpKQpwX3JlZ2lvbl9yYW5rW10KYGBgCgpXZSBiYXItcGxvdCB0aGUgYWJvdmUgcmFua2luZyBieSByZWdpb24gYnkgY291bnR5OgoKIyMjIyMgTm9ydGggVGFpd2FuIOWMl+WPsOeBowoKYGBge3IgcHJlc2lkZW50aWFsX25vcnRoX3JlZ2lvbl9iYXJfcGN0X2RpZmYsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTE3LCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBub3J0aF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWMl+mDqOWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIyMgQ2VudHJhbCBUYWl3YW4g5Lit5Y+w54GjCgpgYGB7ciBwcmVzaWRlbnRpYWxfY2VudHJhbF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0yMCwgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgY2VudHJhbF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOS4remDqOWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIyMgU291dGggVGFpd2FuIOWNl+iHuueBowoKYGBge3IgcHJlc2lkZW50aWFsX3NvdXRoX3JlZ2lvbl9iYXJfcGN0X2RpZmYsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTIyLCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBzb3V0aF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWNl+mDqOWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIyMgRWFzdCBUYWl3YW4g5p2x5Y+w54GjCgpgYGB7ciBwcmVzaWRlbnRpYWxfZWFzdF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBlYXN0X2NvdW50aWVzLAogIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45p2x6YOo5Zyw5Y2A77yI6YSJ6Y6u5biC5Y2A77yJ77ya57ag6JeN5b6X56Wo546H5beuIikKYGBgCgojIyMjIyBPdXRseWluZyBJc2xhbmRzIOmbouWztgoKYGBge3IgcHJlc2lkZW50aWFsX2lzbGFuZF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBpc2xhbmRfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjpm6Lls7blnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyDnhKHmlYjnpaggSW52YWxpZCBWb3RlIENvdW50cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCltJbnZhbGlkIHZvdGVzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcG9pbHRfdm90ZSkgYXJlIHZvdGVzIGNhc3QgYnV0IGRlY2xhcmVkIGludmFsaWQuClRoZXJlIGlzIG5vIHdheSB0byBvYmplY3RpdmVseSByZWNvcmQgdGhlIGludGVudGlvbiBvZiBhbiBpbnZhbGlkIHZvdGUsCmhlcmUgd2Ugc2ltcGx5IHN0YXRpc3RpY2FsbHkgZGVzY3JpYmUgdGhlIHNoYXJlIG9mIGludmFsaWQgdm90ZXMgZnJvbSB0b3RhbCB2b3RlcyBjYXN0LgoKIyMjIyBCeSBDb3VudHkg5L6d57ij5biCCgpgYGB7ciBwcm9jZXNzX3ByZXNpZGVudGlhbF9pbnZhbGlkX3ZvdGVzX2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgUHJvY2VzcyBpbnZhbGlkIHZvdGVzIGJ5IGNvdW50eS4KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBJbnZhbGlkX1ZvdGVzX1NoYXJlOj1nZXQoIueEoeaViOelqOaVuEIiKSAvIGdldCgi5oqV56Wo5pW4QyBDPUErQiIpXQpwX2NvdW50eSA8LSBwX2NvdW50eVssIEludmFsaWRfVm90ZXNfU2hhcmVQOj1JbnZhbGlkX1ZvdGVzX1NoYXJlICogMTAwXQoKIyBKb2luIGludmFsaWQgdm90ZSBzaGFyZXMgdG8gc3BhdGlhbCBkYXRhZnJhbWUuCnR3X2NvdW50eV9zZiA8LSBtZXJnZSh0d19jb3VudHlfc2YsIHBfY291bnR5WywgLihSZWdpb24sIEludmFsaWRfVm90ZXNfU2hhcmVQKV0sIGJ5Lng9Ik5MX05BTUVfMiIsIGJ5Lnk9IlJlZ2lvbiIpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXJfcGN0X2ludmFsaWQsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIEludmFsaWQgVm90ZSBTaGFyZXMgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocF9jb3VudHksIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBJbnZhbGlkX1ZvdGVzX1NoYXJlKSwgeT1JbnZhbGlkX1ZvdGVzX1NoYXJlUCkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBmaWxsPSJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChJbnZhbGlkX1ZvdGVzX1NoYXJlKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+neW7ouelqOeOh+aOkuW6j++8iSIsIHk9IuW7ouelqOeOh++8hSIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muW7ouelqOeOhyIpICsKICBjb29yZF9mbGlwKCkKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpUbyBzZWUgdGhlIGdlb2xvY2F0aW9uYWwgZGlmZmVyZW5jZXM6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X21hcF9pbnZhbGlkLCBmaWcuY2FwPSJDaG9yb3BsZXRoIE1hcCBmb3IgSW52YWxpZCBWb3RlIFNoYXJlcyJ9CnAgPC0gZ2dwbG90KHR3X2NvdW50eV9zZiwgYWVzKHRleHQ9Q291bnR5KSkgKwogIGdlb21fc2YoYWVzKGZpbGw9SW52YWxpZF9Wb3Rlc19TaGFyZVApKSArCiAgY29vcmRfc2YoeGxpbT1jKDExOCwgMTIyLjUpLCB5bGltPWMoMjEuNSwgMjYuNSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KG5hbWU9IuW7ouelqOeOh++8hSIsIGxvdz0id2hpdGUiLCBoaWdoPSJibGFjayIpICsKICBsYWJzKHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5bui56Wo546H77yFIikKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpDaGVjayBpZiB0aGVyZSBpcyBhbnkgY29ycmVsYXRpb24gYmV0d2VlbiBpbnZhbGlkIHZvdGVzIGFuZCB0aGUgRFBQLUtNVCBkaWZmZXJlbmNlczoKCmBgYHtyIHByZXNpZGVudGlhbF9pbnZhbGlkX3ZzZF9jb3VudHksIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIHZzIERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZXMgYnkgQ291bnR5In0KZ2dwbG90KHBfY291bnR5LCBhZXMoeD1JbnZhbGlkX1ZvdGVzX1NoYXJlLCB5PVNoYXJlX0RpZmYsIGxhYmVsPUNvdW50eSkpICsKICBnZW9tX3BvaW50KHNoYXBlPTQsIHNpemU9NCwgc3Ryb2tlPTIpICsKICBsYWJzKHg9IuW7ouelqOeOhyIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muW7ouelqOeOh++8uOe2oOiXjeW+l+elqOeOh+W3riIpICsKICBnZW9tX3RleHRfcmVwZWwoY29sb3I9ImdyZXk0MCIpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgQ291bnR5IFN1Yi1SZWdpb24g5L6d6YSJ6Y6u5biC5Y2ACgpgYGB7ciBwcm9jZXNzX3ByZXNpZGVudGlhbF9pbnZhbGlkX3ZvdGVzX3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUHJvY2VzcyBpbnZhbGlkIHZvdGVzIGJ5IHJlZ2lvbi4KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBJbnZhbGlkX1ZvdGVzX1NoYXJlOj1nZXQoIueEoeaViOelqOaVuEIiKSAvIGdldCgi5oqV56Wo5pW4QyBDPUErQiIpXQpwX3JlZ2lvbiA8LSBwX3JlZ2lvblssIEludmFsaWRfVm90ZXNfU2hhcmVQOj1JbnZhbGlkX1ZvdGVzX1NoYXJlICogMTAwXQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9pbnZhbGlkX3ZzZF9yZWdpb24sIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIEludmFsaWQgVm90ZSBTaGFyZXMgdnMgRFBQLUtNVCBTaGFyZSBEaWZmZXJlbmNlcyBieSBSZWdpb24ifQpwIDwtIGdncGxvdChwX3JlZ2lvbiwgYWVzKHg9SW52YWxpZF9Wb3Rlc19TaGFyZSwgeT1TaGFyZV9EaWZmLCBsYWJlbD1wYXN0ZShCeSwgUmVnaW9uKSkpICsKICBnZW9tX3BvaW50KHNoYXBlPTQsIHNpemU9NCkgKwogIGxhYnMoeD0i5bui56Wo546HIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5bui56Wo546H77y457ag6JeN5b6X56Wo546H5beuIikgKwogICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIpCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpBIHNpbXBsZSBsaW5lYXIgbW9kZWwgb24gaW52YWxpZCB2b3RlIHNoYXJlcyBhZ2FpbnN0IERQUC1LTVQgc2hhcmUgZGlmZmVyZW5jZXMgc3VnZ2VzdHMgdGhlIGNvcnJlbGF0aW9uIGlzIGF0IGxlYXN0IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuCkJ1dCBzdWNoIGNvcnJlbGF0aW9uIG1heSBiZSBbKnNwdXJpb3VzKl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3B1cmlvdXNfcmVsYXRpb25zaGlwKSBzbyB0aGUgaW50ZXJwcmV0YXRpb24gc2hhbGwgYmUgY2F1dGlvdXMuCkFzIHdlIHdpbGwgc2VlIGxhdHRlciBhcyB3ZSBkaWcgaW50byB0aGUgcG9sbGluZyBwbGFjZSBsZXZlbCwKc3VjaCBjb3JyZWxhdGlvbiBiZWNvbWVzIHdlYWtlciAoYW5kIGluZGVlZCBiZWNvbWVzIG5lZ2F0aXZlKS4KCmBgYHtyIGxtX2ludmFsaWR9CmxtX2ludmFsaWQgPC0gbG0oU2hhcmVfRGlmZiB+IEludmFsaWRfVm90ZXNfU2hhcmVQLCBkYXRhPXBfcmVnaW9uKQpjb2VmdGVzdChsbV9pbnZhbGlkLCB2Y292PXZjb3ZIQyhsbV9pbnZhbGlkLCB0eXBlPSJIQzAiKSkKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBQb2xsaW5nIFBsYWNlIOS+neaKlemWi+elqOaJgAoKYGBge3IgcHJvY2Vzc19pbnZhbGlkX3BwbGFjZSwgcmVzdWx0cz0iaGlkZSJ9CiMgUmVhZCBjb3VudHkgc3VicmVnaW9uLWxldmVsIHByZXNpZGVudGlhbCBlbGVjdGlvbiByZXN1bHRzLgpwX3BsYWNlIDwtIGZyZWFkKCJkYXRhL3Byb2Nlc3NlZC9wcmVzaWRlbnRpYWwvcHJlc2lkZW50aWFsX3BwbGFjZXMuY3N2IiwgZW5jb2Rpbmc9IlVURi04IikKcF9wbGFjZSA8LSBwX3BsYWNlWywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCnNldG5hbWVzKHBfcGxhY2UsICLmipXnpajnjodIIEg9Q8O3RyIsICJUdXJub3V0IikKcF9wbGFjZSA8LSBwX3BsYWNlWywgSW52YWxpZF9Wb3Rlc19TaGFyZTo9Z2V0KCLnhKHmlYjnpajmlbhCIikgLyBnZXQoIuaKleelqOaVuEMgQz1BK0IiKV0KcF9wbGFjZSA8LSBwX3BsYWNlWywgSW52YWxpZF9Wb3Rlc19TaGFyZVA6PUludmFsaWRfVm90ZXNfU2hhcmUgKiAxMDBdCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIGJ5IHJlZ2lvbi4KcF9wbGFjZSA8LSBwX3BsYWNlWywgVm90ZV9EaWZmOj1nZXQoIigzKSDolKHoi7Hmlocg6LO05riF5b63IikgLSBnZXQoIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IildCnBfcGxhY2UgPC0gcF9wbGFjZVssIFNoYXJlX0RpZmY6PVZvdGVfRGlmZiAvIGdldCgi5pyJ5pWI56Wo5pW4QSBBPTErMisuLi4rTiIpXQoKIyBXaWRlIHRvIGxvbmcuCnBfcGxhY2VfbCA8LSBtZWx0KHBfcGxhY2VbLCBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIsIGNvbHNfY2FuZGlkYXRlKSwgd2l0aD1GQUxTRV0sCiAgICAgICAgICAgICAgICAgIGlkLnZhcnM9YygiQnkiLCAiUmVnaW9uIiwgIlZpbGxhZ2UiLCAiUGxhY2UiKSwKICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZT0iQ2FuZGlkYXRlIiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwX3BsYWNlX2wgPC0gcF9wbGFjZV9sWywgQ2FuZGlkYXRlOj1mYWN0b3IoQ2FuZGlkYXRlKV0gICMgTGV2ZWwgYnkgY2FuZGlkYXRlIG51bWJlci4KcF9wbGFjZV9sIDwtIHBfcGxhY2VfbFtwX3BsYWNlLCBgOj1gKFNoYXJlX0RpZmY9aS5TaGFyZV9EaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHVybm91dD1pLlR1cm5vdXQpLCBvbj0uKEJ5LCBSZWdpb24sIFZpbGxhZ2UsIFBsYWNlKV0KcF9wbGFjZV9sIDwtIHBfcGxhY2VfbFssIFZvdGVzX1NoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oQnksIFJlZ2lvbiwgVmlsbGFnZSwgUGxhY2UpXQpgYGAKCkxldCdzIHRyeSBhIG5hdGl2ZSBgcGxvdGx5YCBzY2F0dGVyIHBsb3QgdGhpcyB0aW1lLgpTaW5jZSB0aGUgZGF0YSBwb2ludHMgYXJlIHF1aXRlIGEgbG90IGFscmVhZHkgYXQgdGhlIHBvbGxpbmcgcGxhY2UgbGV2ZWwsCmZvciBzY2FsYWJpbGl0eSB3ZSB3aWxsIHVzZSBgV2ViR0xgIGluc3RlYWQgb2YgYFNWR2AgdG8gcmVuZGVyIHRoZSBpbnRlcmFjdGl2ZSBwbG90OgoKYGBge3IgcHJlc2lkZW50aWFsX2ludmFsaWRfdnNkX3BsYWNlLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIHZzIERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZXMgYnkgUG9sbGluZyBQbGFjZSJ9CmZpdCA8LSBsbShTaGFyZV9EaWZmIH4gSW52YWxpZF9Wb3Rlc19TaGFyZSwgZGF0YT1wX3BsYWNlKQpwX3BsYWNlIDwtIHBfcGxhY2VbLCBsYWJlbDo9cGFzdGUoUmVnaW9uLCBWaWxsYWdlLCBQbGFjZSldCnBsb3RfbHkocF9wbGFjZSwgeD1+SW52YWxpZF9Wb3Rlc19TaGFyZSwgeT1+U2hhcmVfRGlmZiwgdGV4dD1+bGFiZWwsCiAgICAgICAgY29sb3I9fkJ5LCBjb2xvcnM9Y29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKG49MTEsIG5hbWU9IlNwZWN0cmFsIikpKDIyKSwKICAgICAgICB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkgJT4lCiAgYWRkX2xpbmVzKHg9fkludmFsaWRfVm90ZXNfU2hhcmUsIHk9Zml0dGVkKGZpdCksIGNvbG9yPUkoImJsYWNrIiksIHNob3dsZWdlbmQ9RkFMU0UpICU+JQogIGxheW91dCh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOmEiemOruW4guWNgO+8muW7ouelqOeOh++8uOe2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9Iue2oOiXjeW+l+elqOeOh+W3riIpLAogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSLlu6LnpajnjociKSwKICAgICAgICAgbWFyZ2luPWxpc3QodD01MCkpICU+JQogIHRvV2ViR0woKQpgYGAKCihCZSBhd2FyZSB0aGF0IHRoZSByZWdyZXNzaW9uIGxpbmUgaXMgYmFzZWQgb24gZnVsbCBkYXRhIGFuZCBkb2Vzbid0IHJlZmxlY3QgYW55IHVzZXIgaW50ZXJhY3Rpb24gY2hhbmdpbmd0aGUgZGlzcGxheWVkIGNvdW50aWVzLikKCiMjIyDmipXnpajnjocgVm90ZXIgVHVybm91dCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCltWb3RlciB0dXJub3V0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Wb3Rlcl90dXJub3V0KSBpcyBkZWZpbmVkIGFzIHRvdGFsIHZvdGVzIGNhc3QgKHZhbGlkIGFuZCBpbnZhbGlkKSBkaXZpZGVkIGJ5IGxlZ2l0aW1hdGUgdm90ZXJzLgpUaGUgaW5mb3JtYXRpb24gaXMgcmVhZGlseSBhdmFpbGFibGUgaW4gdGhlIHNvdXJjZSBkYXRhIGZyb20gdGhlIGNvbHVtbiBg5oqV56Wo546HSCBIPUPDt0dgLgpJbiB0aGlzIHNlY3Rpb24gd2UgZXhwbG9yZSB0aGUgcG9zc2libGUgcmVsYXRpb24gYmV0d2VlbiB0dXJub3V0IGFuZCB2b3RlIGNvdW50cy4KCiMjIyMgQnkgQ291bnR5IOS+nee4o+W4ggoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXQsIHJlc3VsdHM9ImhpZGUifQojIEdldCB2b3RpbmcgcmF0ZSBmcm9tIHdpZGUgZGF0YSB0byBsb25nLgpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbcF9jb3VudHksIFR1cm5vdXQ6PWkuVHVybm91dCwgb249LihDb3VudHkpXQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dF9iYXIsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocF9jb3VudHksIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBUdXJub3V0KSwgeT1UdXJub3V0KSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGZpbGw9IndoaXRlIiwgY29sb3I9ImJsYWNrIikgKwogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUoVHVybm91dCwgIiUiKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+neaKleelqOeOh+aOkuW6j++8iSIsIHk9IuaKleelqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOhyIpICsKICBjb29yZF9mbGlwKCkKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCwgdG9vbHRpcD1OVUxMKQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dF9tYXAsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQ6IENvdW50eSBNYXAifQpwIDwtIGdncGxvdCh0d19jb3VudHlfc2YsIGFlcyh0ZXh0PUNvdW50eSkpICsKICBnZW9tX3NmKGFlcyhmaWxsPVR1cm5vdXQpKSArCiAgY29vcmRfc2YoeGxpbT1jKDExOCwgMTIyLjUpLCB5bGltPWMoMjEuNSwgMjYuNSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KG5hbWU9IuaKleelqOeOh++8hSIsIGxvdz0id2hpdGUiLCBoaWdoPSJyZWQiKSArCiAgbGFicyh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOh++8hSIpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKSXQgaXMgd2lkZWx5IHN1Z2dlc3RlZCB0aGF0IGFuIGluY3JlYXNpbmcgdm90ZXIgdHVybm91dCBkdWUgdG8geW91bmdlciBnZW5lcmF0aW9uIHRoaXMgdGltZSBjYW4gaHVnZWx5IGltcGFjdCB0aGUgcmVzdWx0cy4KSGVyZSB3ZSBwbG90IHRoZSB0dXJub3V0IGFnYWluc3QgRFBQLUtNVCBzaGFyZSBkaWZmZXJlbmNlcyBieSBjb3VudHk6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfdnNkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCBieSBDb3VudHkifQpnZ3Bsb3QocF9jb3VudHksIGFlcyh4PVR1cm5vdXQgLyAxMDAsIHk9U2hhcmVfRGlmZiwgbGFiZWw9Q291bnR5KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YyguMzUsIC44KSkgKwogIGdlb21fcmVjdChkYXRhPXBfY291bnR5WzFdLAogICAgICAgICAgICBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0wLCB5bWF4PUluZiksIGZpbGw9ImxpZ2h0Z3JlZW4iLCBhbHBoYT0uOCkgKwogIGdlb21fcmVjdChkYXRhPXBfY291bnR5WzFdLAogICAgICAgICAgICBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLCBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKwogIGdlb21fdGV4dChjaGVja19vdmVybGFwPVRSVUUsIGNvbG9yPSJncmV5NDAiKSArCiAgbGFicyh4PSLmipXnpajnjociLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrmipXnpajnjofvvLjol43ntqDlvpfnpajnjoflt64iKQpgYGAKCldlIHpvb20taW4gaW4gdGhlIGZvbGxvd2luZyBwbG90IGZvciB0aG9zZSB3aXRoIHR1cm5vdXQgPiA3MCU6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXQ3MF92c2QsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0ICg+NzAlKSBieSBDb3VudHkifQpnZ3Bsb3QocF9jb3VudHlbVHVybm91dCA+IDcwXSwgYWVzKHg9VHVybm91dCAvIDEwMCwgeT1TaGFyZV9EaWZmLCBsYWJlbD1Db3VudHkpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC43LCAuOCkpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVtUdXJub3V0ID4gNzBdWzFdLAogICAgICAgICAgICBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0wLCB5bWF4PUluZiksIGZpbGw9ImxpZ2h0Z3JlZW4iLCBhbHBoYT0uOCkgKwogIGdlb21fcmVjdChkYXRhPXBfY291bnR5W1R1cm5vdXQgPiA3MF1bMV0sCiAgICAgICAgICAgIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9MCksIGZpbGw9ImxpZ2h0Ymx1ZSIsIGFscGhhPS44KSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD0wKSwgY29sb3I9InJlZCIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fdGV4dF9yZXBlbChjb2xvcj0iZ3JleTQwIikgKwogIGxhYnMoeD0i5oqV56Wo546HIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546HKD43MCUp77y457ag6JeN5b6X56Wo546H5beuIikKYGBgCgpXZSBjYW4gYWxzbyB2aXN1YWxpemUgdGhlIHR1cm5vdXQgcmVsYXRpb24gb24gZWFjaCBwYXJ0eSBjYW5kaWRhdGUgaW5zdGVhZDoKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dF92cywgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTMsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgdnMgQ2FuZGlkYXRlIFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CmdncGxvdChwX2NvdW50eV9sLCBhZXMoeD1UdXJub3V0IC8gMTAwLCB5PVZvdGVzX1NoYXJlKSkgKwogIGdlb21fcmVjdChkYXRhPXVuaXF1ZShwX2NvdW50eV9sLCBieT0iQ2FuZGlkYXRlIiksIGFlcyhmaWxsPUNhbmRpZGF0ZSksCiAgICAgICAgICAgIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD1JbmYsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIpICsKICBmYWNldF9ncmlkKH4gQ2FuZGlkYXRlKSArCiAgbGFicyh4PSLmipXnpajnjociLCB5PSLlvpfnpajnjociLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrmipXnpajnjofvvLjlvpfnpajnjociKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIOS+nemEiemOruW4guWNgAoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfcmVnaW9uX3R1cm5vdXR9CiMgQ29tcHV0ZSByZWdpb24tbGV2ZWwgdm90aW5nIHJhdGUgYW5kIHZvdGUgc2hhcmVzIGluIHRoZSBsb25nIGRhdGEuCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFtwX3JlZ2lvbiwgVHVybm91dDo9aS5UdXJub3V0LCBvbj0uKFJlZ2lvbildCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFssIFZvdGVzX1NoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oUmVnaW9uKV0KYGBgCgpGcm9tIHRoZSBwcmV2aW91cyBjb3VudHktbGV2ZWwgdmlzdWFsaXphdGlvbiB3ZSByZWFsaXplZCB0aGF0IHR1cm5vdXQgbWF5IGJlIHJlbGF0ZWQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBERFAgYW5kIEtNVCBjYW5kaWRhdGVzLgpIZXJlIHdlIHVzZSBhIHNpbXBsZSBsaW5lYXIgbW9kZWwgdG8gdGVzdCB0aGUgY29ycmVsYXRpb24gYmFzZWQgb24gcmVnaW9uLWxldmVsIGRhdGE6CgpgYGB7ciBsbV90dXJub3V0X3ZzZH0KbG1fdHVybm91dCA8LSBsbShTaGFyZV9EaWZmIH4gSShUdXJub3V0LzEwMCksIGRhdGE9cF9yZWdpb25fbCkKY29lZnRlc3QobG1fdHVybm91dCwgdmNvdj12Y292SEMobG1fdHVybm91dCwgdHlwZT0iSEMwIikpCmBgYAoKQXBwYXJlbnRseSB0aGUgY29ycmVsYXRpb24gaXMgc2lnbmlmaWNhbnQuCkxldCdzIGFsc28gZ2VuZXJhdGUgdGhlIHJlZ2lvbi1sZXZlbCBzY2F0dGVycGxvdDoKCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdHVybm91dF92c2QsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbiwgYWVzKHg9VHVybm91dCwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0wLCB5bWF4PUluZiksCiAgICAgICAgICAgIGZpbGw9ImxpZ2h0Z3JlZW4iLCBhbHBoYT0uOCkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLAogICAgICAgICAgICBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5oqV56Wo546H77y457ag6JeN5b6X56Wo546H5beuIikKYGBgCgpBZ2FpbiB3aXRoIGFkZGl0aW9uYWwgem9vbS1pbjoKCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdHVybm91dDcwX3ZzZCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgKD43MCUpIGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbltUdXJub3V0ID4gNzBdLCBhZXMoeD1UdXJub3V0LCB5PVNoYXJlX0RpZmYsIGxhYmVsPVJlZ2lvbikpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLAogICAgICAgICAgICBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwKICAgICAgICAgICAgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFKSArCiAgZ2VvbV90ZXh0KGNoZWNrX292ZXJsYXA9VFJVRSwgbnVkZ2VfeT0tLjAzNSwgY29sb3I9ImRhcmtncmV5IikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5oqV56Wo546HKD43MCUp77y457ag6JeN5b6X56Wo546H5beuIikKYGBgCgpXZSBjYW4gYWxzbyB0ZXN0IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHR1cm5vdXQgYW5kIHZvdGUgc2hhcmUgb2YgZWFjaCBwYXJ0eSdzIGNhbmRpZGF0ZXM6CgpgYGB7ciBsbV92cl92c30KZm9yICggY2FuZGlkYXRlIGluIHVuaXF1ZShwX3JlZ2lvbl9sJENhbmRpZGF0ZSkgKSB7CiAgbG1fdHVybm91dF9jYW5kaWRpYXRlIDwtIGxtKFZvdGVzX1NoYXJlIH4gSShUdXJub3V0IC8gMTAwKSwgZGF0YT1wX3JlZ2lvbl9sW0NhbmRpZGF0ZSA9PSBjYW5kaWRhdGVdKQogIG1lc3NhZ2UocmVwKCItIiwgODApKQogIG1lc3NhZ2UoIlRlc3QgY29ycmVsYXRpb24gYmV0d2VlbiB2b3RlIHNoYXJlcyBhbmQgdm90ZXIgdHVybm91dC4iKQogIG1lc3NhZ2Uoc3ByaW50ZigiRm9yICVzOiIsIGNhbmRpZGF0ZSkpCiAgcHJpbnQoY29lZnRlc3QobG1fdHVybm91dF9jYW5kaWRpYXRlLCB2Y292PXZjb3ZIQyhsbV90dXJub3V0X2NhbmRpZGlhdGUsIHR5cGU9IkhDMCIpKSkKfQpgYGAKCkludGVyZXN0aW5nbHksCnN1Y2ggY29ycmVsYXRpb24gaXMgbm90IGZvdW5kIGZvciBQRlAgY2FuZGlkYXRlcy4KCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdHVybm91dF92cywgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTMsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgdnMgQ2FuZGlkYXRlIFZvdGUgU2hhcmVzIGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbl9sLCBhZXMoeD1UdXJub3V0IC8gMTAwLCB5PVZvdGVzX1NoYXJlKSkgKwogIGdlb21fcmVjdChkYXRhPXVuaXF1ZShwX3JlZ2lvbl9sLCBieT0iQ2FuZGlkYXRlIiksIGFlcyhmaWxsPUNhbmRpZGF0ZSksCiAgICAgICAgICAgIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD1JbmYsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIpICsKICBmYWNldF9ncmlkKH4gQ2FuZGlkYXRlKSArCiAgbGFicyh4PSLmipXnpajnjociLCB5PSLlvpfnpajnjociLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrmipXnpajnjocgWCDlvpfnpajnjociKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IFBvbGxpbmcgUGxhY2Ug5L6d5oqV6ZaL56Wo5omACgpgYGB7ciBwcmVzaWRlbnRpYWxfcGxhY2VfdHVybm91dF92c2QsIG1lc3NhZ2U9RkFMU0V9CnBfcGxhY2VfbCA8LSBwX3BsYWNlX2xbLCBsYWJlbDo9cGFzdGUoUmVnaW9uLCBWaWxsYWdlLCBQbGFjZSldCmZpdDAgPC0gbG0oU2hhcmVfRGlmZiB+IEkoVHVybm91dCAvIDEwMCksIGRhdGE9cF9wbGFjZV9sKQoKIyBUT0RPOgojIGFkZF9saW5lcyBhbHdheXMgcGxvdCBtYXJrZXJzIGFzIHdlbGwuIEEgYnVnPwpwbG90X2x5KAogIHBfcGxhY2VfbCwgeD1+KFR1cm5vdXQgLyAxMDApLCB5PX5TaGFyZV9EaWZmLCB0ZXh0PX5sYWJlbCwgbWFya2VyPWxpc3Qoc2l6ZT0zLCBjb2xvcj0iYmxhY2siKSwKICB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsCiAgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKSAlPiUKICBhZGRfdHJhY2UobW9kZT0ibGluZXMiLCBsaW5lPWxpc3QoY29sb3I9ImJsYWNrIiksCiAgICAgICAgICAgIHg9fihUdXJub3V0IC8gMTAwKSwgeT1maXR0ZWQoZml0MCksIHNob3dsZWdlbmQ9RkFMU0UpICU+JQogIGxheW91dCh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOaKlemWi+elqOaJgO+8muaKleelqOeOhyBYIOiXjee2oOW+l+elqOeOh+W3riIsCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IuiXjee2oOW+l+elqOeOh+W3riIpLAogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSLmipXnpajnjociKSwKICAgICAgICAgbWFyZ2luPWxpc3QodD01MCkpICU+JQogIHRvV2ViR0woKQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9wbGFjZV90dXJub3V0X3ZzfQojIFRoaXMgcGxvdCBpcyBhIGJpdCB0cm91Ymxlc29tZSB0byBvcHRpbWl6ZS4uLgpmaXQxIDwtIGxtKFZvdGVzX1NoYXJlIH4gSShUdXJub3V0IC8gMTAwKSwgZGF0YT1wX3BsYWNlX2wxIDwtIHBfcGxhY2VfbFtDYW5kaWRhdGUgPT0gIigxKSDlrovmpZrnkZwg5L2Z5rmYIl0pCmZpdDIgPC0gbG0oVm90ZXNfU2hhcmUgfiBJKFR1cm5vdXQgLyAxMDApLCBkYXRhPXBfcGxhY2VfbDIgPC0gcF9wbGFjZV9sW0NhbmRpZGF0ZSA9PSAiKDIpIOmfk+Wci+eRnCDlvLXlloTmlL8iXSkKZml0MyA8LSBsbShWb3Rlc19TaGFyZSB+IEkoVHVybm91dCAvIDEwMCksIGRhdGE9cF9wbGFjZV9sMyA8LSBwX3BsYWNlX2xbQ2FuZGlkYXRlID09ICIoMykg6JSh6Iux5paHIOiztOa4heW+tyJdKQoKcDEgPC0gcGxvdF9seSgKICBwX3BsYWNlX2wxLCB4PX4oVHVybm91dCAvIDEwMCksIHk9flZvdGVzX1NoYXJlLCB0ZXh0PX5sYWJlbCwKICBjb2xvcj1+Q2FuZGlkYXRlLCBjb2xvcnM9bWFpbl9wYXJ0eV9jb2xvcnNbMV0sIG1hcmtlcj1saXN0KHNpemU9MyksCiAgd2lkdGg9NjAwLCBoZWlnaHQ9NjAwLAogIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIikgJT4lCiAgYWRkX2xpbmVzKGRhdGE9cF9wbGFjZV9sMSwKICAgICAgICAgICAgeD1+KFR1cm5vdXQgLyAxMDApLCB5PWZpdHRlZChmaXQxKSwgY29sb3I9SShtYWluX3BhcnR5X2NvbG9yc1sxXSksIHNob3dsZWdlbmQ9RkFMU0UpCnAyIDwtIHBsb3RfbHkoCiAgcF9wbGFjZV9sMiwgeD1+KFR1cm5vdXQgLyAxMDApLCB5PX5Wb3Rlc19TaGFyZSwgdGV4dD1+bGFiZWwsCiAgY29sb3I9fkNhbmRpZGF0ZSwgY29sb3JzPW1haW5fcGFydHlfY29sb3JzWzJdLCBtYXJrZXI9bGlzdChzaXplPTMpLAogIHdpZHRoPTYwMCwgaGVpZ2h0PTYwMCwKICB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIpICU+JQogIGFkZF9saW5lcyhkYXRhPXBfcGxhY2VfbDIsCiAgICAgICAgICAgIHg9fihUdXJub3V0IC8gMTAwKSwgeT1maXR0ZWQoZml0MiksIGNvbG9yPUkobWFpbl9wYXJ0eV9jb2xvcnNbMl0pLCBzaG93bGVnZW5kPUZBTFNFKQpwMyA8LSBwbG90X2x5KAogIHBfcGxhY2VfbDMsIHg9fihUdXJub3V0IC8gMTAwKSwgeT1+Vm90ZXNfU2hhcmUsIHRleHQ9fmxhYmVsLAogIGNvbG9yPX5DYW5kaWRhdGUsIGNvbG9ycz1tYWluX3BhcnR5X2NvbG9yc1szXSwgbWFya2VyPWxpc3Qoc2l6ZT0zKSwKICB3aWR0aD02MDAsIGhlaWdodD02MDAsCiAgdHlwZT0ic2NhdHRlciIsIG1vZGU9Im1hcmtlcnMiKSAlPiUKICBhZGRfbGluZXMoZGF0YT1wX3BsYWNlX2wzLAogICAgICAgICAgICB4PX4oVHVybm91dCAvIDEwMCksIHk9Zml0dGVkKGZpdDMpLCBjb2xvcj1JKG1haW5fcGFydHlfY29sb3JzWzNdKSwgc2hvd2xlZ2VuZD1GQUxTRSkKYGBgCgpgYGB7ciBwcmVzaWRlbnRpYWxfcGxhY2VfdHVybm91dF92c18yLCBtZXNzYWdlPUZBTFNFfQpwMiAlPiUKICBsYXlvdXQodGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITmipXplovnpajmiYDvvJrmipXnpajnjocgWCDpn5PlvLXlvpfnpajnjociLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSLlvpfnpajnjociLCByYW5nZW1vZGU9Im5vbm5lZ2F0aXZlIiwgc2NhbGVhbmNob3I9IngiKSwKICAgICAgICAgeGF4aXM9bGlzdCh0aXRsZT0i5oqV56Wo546HIiwgcmFuZ2Vtb2RlPSJub25uZWdhdGl2ZSIpLAogICAgICAgICBtYXJnaW49bGlzdCh0PTUwKSkgJT4lCiAgdG9XZWJHTCgpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX3BsYWNlX3R1cm5vdXRfdnNfMywgbWVzc2FnZT1GQUxTRX0KcDMgJT4lCiAgbGF5b3V0KHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE5oqV6ZaL56Wo5omA77ya5oqV56Wo546HIFgg6JSh6LO05b6X56Wo546HIiwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0i5b6X56Wo546HIiwgcmFuZ2Vtb2RlPSJub25uZWdhdGl2ZSIsIHNjYWxlYW5jaG9yPSJ4IiksCiAgICAgICAgIHhheGlzPWxpc3QodGl0bGU9IuaKleelqOeOhyIsIHJhbmdlbW9kZT0ibm9ubmVnYXRpdmUiKSwKICAgICAgICAgbWFyZ2luPWxpc3QodD01MCkpICU+JQogIHRvV2ViR0woKQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9wbGFjZV90dXJub3V0X3ZzXzEsIG1lc3NhZ2U9RkFMU0V9CnAxICU+JQogIGxheW91dCh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOhyBYIOWui+S9meW+l+elqOeOhyIsCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9IuW+l+elqOeOhyIsIHJhbmdlbW9kZT0ibm9ubmVnYXRpdmUiLCBzY2FsZWFuY2hvcj0ieCIpLAogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSLmipXnpajnjociLCByYW5nZW1vZGU9Im5vbm5lZ2F0aXZlIiksCiAgICAgICAgIG1hcmdpbj1saXN0KHQ9NTApKSAlPiUKICB0b1dlYkdMKCkKYGBgCgpKdXN0IGEgc2lkZSBub3RlLApjb3JyZWxhdGlvbiBiZXR3ZWVuIHR1cm5vdXQgYW5kIHZvdGUgc2hhcmUgZm9yIFBGUCBjYW5kaWRhdGUgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdCB0aGUgcG9sbGluZyBwbGFjZSBsZXZlbCwKYnV0IG5vdCBlY29ub21pY2FsbHkgc2lnbmlmaWNhbnQgKGluIHRlcm1zIG9mIGVmZmVjdCBzaXplKS4KCmBgYHtyIHR1cm5vdXRfb25fcGZwX3ZvdGVfc2hhcmV9CmNvZWZ0ZXN0KGZpdDEsIHZjb3Y9dmNvdkhDKGZpdDEsIHR5cGU9IkhDMCIpKQpgYGAKCkEgMSUgaW5jcmVhc2UgaW4gdHVybm91dCBpcyBvbmx5IGFzc29jaWF0ZWQgd2l0aCAwLjAxJSBpbmNyZWFzZSBpbiB2b3RlIHNoYXJlLgpTdWNoIHNpemUgZWZmZWN0IGZvciBEUFAgY2FuZGlkYXRlIGlzIGEgY29uc2lkZXJhYmxlIDAuNTElOgoKYGBge3IgdHVybm91dF9vbl9kcHBfdm90ZV9zaGFyZX0KY29lZnRlc3QoZml0MywgdmNvdj12Y292SEMoZml0MywgdHlwZT0iSEMwIikpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIOesrOWNgeWxhueri+azleWnlOWToemBuOiIiee1kOaenCBUaGUgMTB0aCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBSZXN1bHRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIOS4jeWIhuWNgOeri+WnlCBQYXJ0eSBMaXN0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IgcHJvY2Vzc19wYXJ0eV9saXN0X3Jlc3VsdHMsIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgcGFydHktbGlzdCByZXN1bHRzLgojIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgZG93biB0byBwb2xsaW5nIHBsYWNlIGxldmVsLgpwYXJ0eWxpc3QgPC0gZnJlYWQoImRhdGEvcHJvY2Vzc2VkL2xlZ2lzbGF0aXZlL2xlZ2lzbGF0aXZlX3BhcnR5bGlzdC5jc3YiLCBlbmNvZGluZz0iVVRGLTgiKQpwYXJ0eWxpc3QgPC0gcGFydHlsaXN0WywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCmNvbHNfYXJlYSA8LSBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIpCmNvbHNfcGFydHkgPC0gbmFtZXMocGFydHlsaXN0KVs3OjI1XSAgIyBUaGVyZSBhcmUgMTkgcGFydGllcyBpbiB0b3RhbC4KcGFydHlsaXN0X2wgPC0gbWVsdChwYXJ0eWxpc3RbLCBjKGNvbHNfYXJlYSwgY29sc19wYXJ0eSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jb2xzX2FyZWEsIHZhcmlhYmxlLm5hbWU9IlBhcnR5IiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwYXJ0eWxpc3RfbCA8LSBwYXJ0eWxpc3RfbFssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXQpwYXJ0eWxpc3RfZmluYWwgPC0gcGFydHlsaXN0X2xbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKFBhcnR5KV0KcGFydHlsaXN0X2ZpbmFsIDwtIHBhcnR5bGlzdF9maW5hbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmBgYAoKRm9yIHBhcnR5IGxpc3QgdG8gc2VjdXJlIGF0IGxlYXN0IG9uZSBzZWF0IGluIFtMZWdpc2xhdGl2ZSBZdWFuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZWdpc2xhdGl2ZV9ZdWFuKSwKaXQgbXVzdCBvYnRhaW4gbWluaW1hbGx5IDUlIG9mIHBhcnR5LWxpc3Qgdm90ZXMuCklmIGEgcGFydHkgY2Fubm90IHBhc3MgdGhlIDUlIHRocmVzaG9sZCBidXQgcGFzcyB0aGUgMyUgdGhyZXNob2xkLAppdCB3aWxsIGJlIHNwb25zb3JlZCBieSB0aGUgZ292ZXJubWVudCBpbiB0aGUgZm9sbG93aW5nIDQgeWVhcnMgKGJhc2VkIG9uIG51bWJlciBvZiB2b3RlcyBvYnRhaW5lZCkuClRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3Igc21hbGwgcGFydGllcyB0byBjb3ZlciB0aGVpciBvcGVyYXRpbmcgY29zdHMuCgpgYGB7ciBwYXJ0eWxpc3RfZmluYWxfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IEZpbmFsIE91dGNvbWUifQp0aHJlc18wMDMgPC0gc3VtKHBhcnR5bGlzdF9maW5hbCRWb3RlcykgKiAuMDMKdGhyZXNfMDA1IDwtIHN1bShwYXJ0eWxpc3RfZmluYWwkVm90ZXMpICogLjA1CgpnZ3Bsb3QocGFydHlsaXN0X2ZpbmFsLCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLmlL/pu6giLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPkuI3liIbljYDnq4vlp5TpgbjoiInntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PVBhcnR5LCB5PVZvdGVzLAogICAgICAgICAgICAgICAgbGFiZWw9c3ByaW50ZigiJXMgKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUsIC4wMSkpKSwKICAgICAgICAgICAgc2l6ZT0zLCBoanVzdD0tLjA1KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hLCBsaW1pdHM9YygwLCBtYXgocGFydHlsaXN0X2ZpbmFsJFZvdGVzKSAqIDEuMjUpKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD10aHJlc18wMDMsIGNvbG9yPSLoo5zliqkgU3BvbnNvcnNoaXAiKSwgbGluZXR5cGU9MykgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9dGhyZXNfMDA1LCBjb2xvcj0i5bit5qyhIFNlYXRzIiksIGxpbmV0eXBlPTMpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWU9IumWgOaquyBUaHJlc2hvbGQiLCB2YWx1ZXM9YygicmVkIiwgImdyZWVuIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCldlIGdyb3VwIHBhcnRpZXMgd2l0aCBsZXNzIHRoYW4gMiUgdm90ZXMgaW50byAib3RoZXJzIiB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBwbG90cyBlYXNpZXIgdG8gcmVhZC4KCmBgYHtyIHByb2Nlc3NfcGFydHlfbGlzdF9jb3VudHksIHJlc3VsdHM9ImhpZGUifQpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXQpzbWFsbF9wYXJ0aWVzIDwtIHBhcnR5bGlzdF9maW5hbFtTaGFyZSA8IC4wMiwgUGFydHldCgojIENvbXB1dGUgc2hhcmVzIGZvciBhbGwgcGFydGllcy4KcGFydHlsaXN0X2NvdW50eSA8LSBwYXJ0eWxpc3RfY291bnR5WywgUGFydHk6PWZhY3RvcihQYXJ0eSldCnBhcnR5bGlzdF9jb3VudHkgPC0gcGFydHlsaXN0X2NvdW50eVssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oQnkpXQoKIyBBYnNvcmIgc21hbGwgcGFydGllcyBhbmQgcmUtY29tcHV0ZSBzaGFyZXMuCnBhcnR5bGlzdF9jb3VudHkyIDwtIGNvcHkocGFydHlsaXN0X2NvdW50eSkKcGFydHlsaXN0X2NvdW50eTIgPC0gcGFydHlsaXN0X2NvdW50eTJbUGFydHkgJWluJSBzbWFsbF9wYXJ0aWVzLCBQYXJ0eTo9IuWFtuS7liJdCnBhcnR5bGlzdF9jb3VudHkyIDwtIHBhcnR5bGlzdF9jb3VudHkyWywgUGFydHk6PWZhY3RvcihQYXJ0eSldCnBhcnR5bGlzdF9jb3VudHkyIDwtIHBhcnR5bGlzdF9jb3VudHkyWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXSAgIyBSZS1ncm91cC4KcGFydHlsaXN0X2NvdW50eTIgPC0gcGFydHlsaXN0X2NvdW50eTJbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKEJ5KV0KCiMgQ29tcHV0ZSBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzLgpwYXJ0eWxpc3RfY291bnR5X2diIDwtIHBhcnR5bGlzdF9jb3VudHlbUGFydHkgJWluJSBjKCIoMTQpICDmsJHkuLvpgLLmraXpu6giLCAiKDkpICDkuK3lnIvlnIvmsJHpu6giKV0Kc2V0b3JkZXIocGFydHlsaXN0X2NvdW50eV9nYiwgQnksIFBhcnR5KQpwYXJ0eWxpc3RfY291bnR5X2diX2RpZmYgPC0gcGFydHlsaXN0X2NvdW50eV9nYlssIC4oU2hhcmVfRGlmZj1TaGFyZVsyXSAtIFNoYXJlWzFdKSwgYnk9LihCeSldCnBhcnR5bGlzdF9jb3VudHlfZ2JfZGlmZiA8LSBwYXJ0eWxpc3RfY291bnR5X2diX2RpZmZbLCBkcHBfd2luOj1TaGFyZV9EaWZmID4gMF0KYGBgCgpgYGB7ciBwYXJ0eV9saXN0X2NvdW50eSwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gUGFydHkgTGlzdCBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpwYXJ0eV9jb2xvcnMgPC0gYygiZGFya29yYW5nZSIsICJkYXJrZ3JlZW4iLCAieWVsbG93IiwgImRvZGdlcmJsdWUiLCAiZ3JlZW4iLCAiZ3JlZW4zIiwgImxpZ2h0Ymx1ZSIsICJncmV5IikKZ2dwbG90KHBhcnR5bGlzdF9jb3VudHkyLCBhZXMoeD1yZW9yZGVyKEJ5LCBWb3RlcyksIHk9U2hhcmUsIGZpbGw9UGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siLCB3aWR0aD0uOCkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIsIGFuZ2xlPTIwKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0i5pS/6buoIiwgdmFsdWVzPXBhcnR5X2NvbG9ycykgKwogIGxhYnMoeD0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC5pS/6buo5b6X56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpgYGAKCk9yIHRvIGluY29ycG9yYXRlIGFsbCBwYXJ0aWVzIGludG8gb25lIHBsb3QsCndlIGNhbiBwbG90IHRoZSBpbnRlcmFjdGl2ZSB2ZXJzaW9uIHdpdGggbm8gYW5ub3RhdGlvbiBidXQgZGV0YWlsZWQgaG92ZXItb24gaW5mbzoKCmBgYHtyIHBhcnR5X2xpc3RfY291bnR5X2Jhcl9wbG90bHksIGZnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CiMgSGFuZGxlIGJhciBjb2xvcmluZy4gKFF1aXRlIGFuIGVmZm9ydCEpCiMgV2UgYm9ycm93IHRoZSByZXByZXNlbnRpbmcgY29sb3JzIGZyb20gd2lraSBwYWdlICh3aGljaCBzZWVtcyB0byBiZSBiYXNlZCBvbiBwYXJ0eSBsb2dvKS4KcGFnZSA8LSByZWFkX2h0bWwoImh0dHBzOi8vemgud2lraXBlZGlhLm9yZy93aWtpLzIwMjDlubTkuK3oj6/msJHlnIvnq4vms5Xlp5Tlk6HpgbjoiIkiKQpub2RlcyA8LSBodG1sX25vZGVzKHBhZ2UsIHhwYXRoPSIvL3RhYmxlW2NvbnRhaW5zKEBjbGFzcywgJ3dpa2l0YWJsZSBzb3J0YWJsZScpIGFuZCBjb250YWlucyguLCAnMjAyMOW5tOS4reiPr+awkeWci+eri+azleWnlOWToeaUv+m7qOaPkOWQjeWQjemhjScpXS8vdHIvdGRbMV0iKQp3X2NvbG9ycyA8LSBnc3ViKCIuKlsgXXw7IiwgIiIsICBodG1sX2F0dHIobm9kZXMsICJzdHlsZSIpKQp3X3BhcnR5X25hbWVzIDwtIGh0bWxfdGV4dChub2RlcywgdHJpbT1UUlVFKQphbGxfcGFydHlfY29sb3JzIDwtIGRhdGEudGFibGUocD13X3BhcnR5X25hbWVzLCBjb2xvcj13X2NvbG9ycykKcGFydHlfbmFtZV93X251bSA8LSBkYXRhLnRhYmxlKFBhcnR5PWxldmVscyhwYXJ0eWxpc3RfY291bnR5JFBhcnR5KSkKcGFydHlfbmFtZV93X251bSA8LSBwYXJ0eV9uYW1lX3dfbnVtWywgcDo9Z3N1YigiLipbIF0iLCAiIiwgUGFydHkpXQpwYXJ0eV9uYW1lX3dfbnVtIDwtIG1lcmdlKHBhcnR5X25hbWVfd19udW0sIGFsbF9wYXJ0eV9jb2xvcnMsIGJ5PSJwIikKCiMgQWxpZ24gcGxvdGx5IGludGVybmFsIG9yZGVyaW5nIG9mIGdyb3VwaW5nLiAoSXQgZG9lc24ndCByZXNwZWN0IGZhY3RvciBsZXZlbC4pCnBhcnR5X25hbWVfd19udW0gPC0gcGFydHlfbmFtZV93X251bVssIGk6PWFzLmludGVnZXIoIGdzdWIoIl5cXCh8XFwpLioiLCAiIiwgUGFydHkpKV0Kc2V0b3JkZXIocGFydHlfbmFtZV93X251bSwgaSkKCiMgRmluYWxseS4uLgpwbG90X2x5KHBhcnR5bGlzdF9jb3VudHksIHk9fnJlb3JkZXIoQnksIFZvdGVzKSwgeD1+U2hhcmUsIHRleHQ9flZvdGVzLAogICAgICAgIHR5cGU9ImJhciIsICBvcmllbnRhdGlvbj0iaCIsCiAgICAgICAgY29sb3I9flBhcnR5LCBjb2xvcnM9cGFydHlfbmFtZV93X251bSRjb2xvciwKICAgICAgICB3aWR0aD04MDAsIGhlaWdodD02MDApICU+JQogIGxheW91dChiYXJtb2RlPSJzdGFjayIsCiAgICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC5pS/6buo5b6X56Wo546HIiwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiksCiAgICAgICAgIHhheGlzPWxpc3QodGl0bGU9IuW+l+elqOaVuCIpLAogICAgICAgICBsZWdlbmQ9bGlzdChvcmllbnRhdGlvbj0iaCIpLAogICAgICAgICBtYXJnaW49bGlzdCh0PTUwKSkKYGBgCgpgYGB7ciBwYXJ0eV9saXN0X2RwcF9rbXRfZGlmZiwgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZSBieSBDb3VudHkifQpwIDwtIGdncGxvdChwYXJ0eWxpc3RfY291bnR5X2diX2RpZmYsIGFlcyh4PXJlb3JkZXIoQnksIFNoYXJlX0RpZmYpLCBmaWxsPWRwcF93aW4sIHk9U2hhcmVfRGlmZikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBjb2xvcj0iYmxhY2siLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJkb2RnZXJibHVlIiwgImdyZWVuMyIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlX0RpZmYpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIuNSkgKwogIGxhYnMoeD0i57ij5biC77yI5L6d5b6X56Wo546H5beu5o6S5bqP77yJIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC77ya57ag6JeN5b6X56Wo546H5beuIikgKwogIGNvb3JkX2ZsaXAoKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIOS+nemEiemOruW4guWNgAoKYGBge3IgcHJvY2Vzc19wYXJ0eV9saXN0X3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUHJvY2VzcyByZWdpb24tbGV2ZWwgcGFydHkgbGlzdCByZXN1bHRzLgpwYXJ0eWxpc3RfcmVnaW9uIDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUmVnaW9uLCBQYXJ0eSldCnBhcnR5bGlzdF9yZWdpb24gPC0gcGFydHlsaXN0X3JlZ2lvblssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXSAgIyBSZW5ldyBsZXZlbC4KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uWywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihCeSwgUmVnaW9uKV0KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uWyFQYXJ0eSAlaW4lIHNtYWxsX3BhcnRpZXNdICAjIElnbm9yZSBzbWFsbCBwYXJ0aWVzLgoKIyBHZXQgcHJlc2lkZW50aWFsIGludmFsaWQgdm90ZSBzaGFyZSBhbmQgdHVybm91dC4KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uW3BfcmVnaW9uLCBgOj1gKAogIFBfSW52YWxpZF9Wb3Rlc19TaGFyZT1pLkludmFsaWRfVm90ZXNfU2hhcmUsCiAgUF9UdXJub3V0PWkuVHVybm91dAogICksIG9uPS4oQnksIFJlZ2lvbildCgojIEdldCBwcmVzaWRlbnRpYWwgdm90ZSByZXN1bHRzLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBQX1NoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oQnksIFJlZ2lvbildCnBhcnR5bGlzdF9yZWdpb24gPC0gbWVyZ2UocGFydHlsaXN0X3JlZ2lvbiwgcF9yZWdpb25fbFssIC4oQnksIFJlZ2lvbiwgQ2FuZGlkYXRlLCBQX1NoYXJlLCBTaGFyZV9EaWZmKV0sIGJ5PWMoIkJ5IiwgIlJlZ2lvbiIpLCBhbGxvdy5jYXJ0ZXNpYW49VFJVRSkKCiMgSGVscGVyIGZ1bmN0aW9uIGZvciBzY2F0dGVyIHBsb3QuCnNjYXR0ZXJwbG90IDwtIGZ1bmN0aW9uKCkgewogIGdncGxvdChwYXJ0eWxpc3RfcmVnaW9uLCBhZXMoeD1TaGFyZSwgeT1QX1NoYXJlLCBjb2xvcj1DYW5kaWRhdGUpKSArCiAgICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocGFydHlsaXN0X3JlZ2lvbiwgYnk9YygiUGFydHkiLCAiQ2FuZGlkYXRlIikpLCBhZXMoZmlsbD1QYXJ0eSksCiAgICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZiwgYWxwaGE9LjI1KSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFydHlfY29sb3JzKSArCiAgICBnZW9tX3BvaW50KHNpemU9LjUpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBhZXMoY29sb3I9Q2FuZGlkYXRlKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogICAgbGFicyh4PSLnuL3ntbHlgJnpgbjkurrlvpfnpajnjociLCB5PSLkuI3liIbljYDmlL/pu6jlvpfnpajnjociLAogICAgICAgICB0aXRsZT0iMjAyMOe4vee1seWAmemBuOS6uuW+l+elqOeOh++8uOS4jeWIhuWNgOaUv+m7qOW+l+elqOeOhyIpICsKICAgIGZhY2V0X3dyYXAoUGFydHkgfiBDYW5kaWRhdGUsIG5jb2w9Mywgc2NhbGVzPSJmcmVlIikKfQpgYGAKCldlIGNhbiBwbG90IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHByZXNpZGVudGlhbCBjYW5kaWRhdGUgdm90ZSBzaGFyZXMgYW5kIHBhcnR5IHZvdGUgc2hhcmVzIGF0IHJlZ2lvbiBsZXZlbC4KQnV0IHdlIG11c3QgYmUgdmVyeSBjYXJlZnVsIGluIGludGVycHJldGluZyB0aGUgcmVsYXRpb24gc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZGlyZWN0aW9uIG9mIHN1Y2ggcmVsYXRpb24sIGlmIGFueS4KU3RyaWN0bHkgc3BlYWtpbmcsCndlIGRvbid0IGV2ZW4ga25vdyB3aGV0aGVyIHRoZXkgYXJlIGNhdXNhbGx5IHJlbGF0ZWQgYXQgYWxsLgoKYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFBhcnR5IExpc3QgU2hhcmVzIHYucy4gUHJlc2lkZW50aWFsIFZvdGVzIn0Kc2NhdHRlcnBsb3QoKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMg5YiG5Y2A56uL5aeUIENvbnN0aXR1ZW5jeSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyMgT3ZlcmFsbCDmpoLmi6wKCmBgYHtyIHByb2Nlc3NfY29uc3RpdHVlbmN5LCByZXN1bHRzPSJoaWRlIn0KIyBQcm9jZXNzIGNvbnN0aXR5ZW5jeSByZXN1bHRzLgojIE5vdGUgdGhhdCBlYWNoIGRpc3RyaWN0IGNhbiBoYXZlIGEgdmFyeWluZyBudW1iZXIgb2YgY2FuZGlkYXRlcy4KaW5maWxlc19jb25zdGl0dWVuY3kgPC0gZ3JlcCgKICAiY29uc3RpdHVlbmN5IixkaXIoImRhdGEvcHJvY2Vzc2VkL2xlZ2lzbGF0aXZlLyIsIGZ1bGwubmFtZXM9VFJVRSksIHZhbHVlPVRSVUUpCgpjX2FsbCA8LSBsYXBwbHkoaW5maWxlc19jb25zdGl0dWVuY3ksIGZyZWFkLCBlbmNvZGluZz0iVVRGLTgiKQpuYW1lcyhjX2FsbCkgPC0gZ3N1YigibGVnaXNsYXRpdmVfY29uc3RpdHVlbmN5XyIsICIiLAogICAgICAgICAgICAgICAgICAgICB0b29sczo6ZmlsZV9wYXRoX3NhbnNfZXh0KGJhc2VuYW1lKGluZmlsZXNfY29uc3RpdHVlbmN5KSkpCgojIENvbnZlcnQgYWxsIHRhYmxlIGZyb20gd2lkZSB0byBsb25nLgp3aWRlX3RvX2xvbmcgPC0gZnVuY3Rpb24oRFQpIHsKICBjYW5kaWRhdGVfc3RhcnRfaW5kIDwtIDcKICBjYW5kaWRhdGVfZW5kX2luZCA8LSBuY29sKERUKSAtIDgKICBjb2xzX2NhbmRpZGF0ZSA8LSBuYW1lcyhEVClbY2FuZGlkYXRlX3N0YXJ0X2luZDpjYW5kaWRhdGVfZW5kX2luZF0KICBjb2xzX3JlZ2lvbiA8LSBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIpCiAgb3V0IDwtIG1lbHQoRFRbLCBjKGNvbHNfcmVnaW9uLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgIGlkLnZhcnM9Y29sc19yZWdpb24sIHZhcmlhYmxlLm5hbWU9IkNhbmRpZGF0ZSIsIHZhbHVlLm5hbWU9IlZvdGVzIikKICBvdXQKfQoKY19sIDwtIHJiaW5kbGlzdChsYXBwbHkoY19hbGwsIHdpZGVfdG9fbG9uZykpCmNfbCA8LSBjX2xbLCBSZWdpb246PXRyaW13cyhSZWdpb24sIHdoaXRlc3BhY2U9IltcXGhcXHZdIildICAjIFRyaW0gZnVsbC13aWR0aCB3aGl0ZQoKIyBFeHRyYWN0IGNhbmRpZGF0ZSBwYXJ0eSBmb3IgYWxsIGRpc3RyaWN0cy4KY19sIDwtIGNfbFssIFBhcnR5Oj1nc3ViKCIuKlsgXSIsICIiLCBDYW5kaWRhdGUpXQoKIyBTdW0gYnkgcGFydHkuCmNfcGFydHkgPC0gY19sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihQYXJ0eSldCmNfcGFydHkgPC0gY19wYXJ0eVssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmBgYAoKQ2hlY2sgbnVtYmVyIG9mIHBvbGxpbmcgcGxhY2VzIGZvciBlYWNoIGRpc3RyaWN0OgoKYGBge3IgbnVtYmVyX29mX3BwbGFjZV9ieV9kaXN0cmljdH0KY19wcGxhY2VfY250IDwtIGNfbFssIC5OLCBieT0uKEJ5KV0Kc2V0b3JkZXIoY19wcGxhY2VfY250LCBCeSkKc2V0bmFtZXMoY19wcGxhY2VfY250LCBjKCJEaXN0cmljdCIsICJOdW0gb2YgUG9sbGluZyBQbGFjZSIpKQpjX3BwbGFjZV9jbnRbXQpgYGAKCmBgYHtyIGNvbnN0aXR1ZW5jeV9wYXJ0eV9yZXN1bHQsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OC4zMywgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBDb25zdGl0dWVuY3kgT3V0Y29tZSBieSBQYXJ0eSJ9CmdncGxvdChjX3BhcnR5LCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLmlL/pu6giLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPliIbljYDnq4vlp5TpgbjoiInntZDmnpw65L6d5YCZ6YG45Lq65pS/6buoIikgKwogIGdlb21fdGV4dChhZXMoeD1QYXJ0eSwgeT1Wb3RlcywKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzICglcykiLCBzY2FsZXM6OmNvbW1hKFZvdGVzKSwgc2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSksCiAgICAgICAgICAgIHNpemU9MywgaGp1c3Q9LS4wNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpjb21tYSwgbGltaXRzPWMoMCwgbWF4KGNfcGFydHkkVm90ZXMpICogMS4yKSkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCmBgYHtyIHByb2Nlc3NfY29uc3RpdHVlbmN5X2J5X3BhcnR5X2J5X2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgS2VlcCBvbmx5IHRoZSB0b3AgZmV3IHBhcnRpZXMuCmNfdG9wX3BhcnR5IDwtIGNfcGFydHlbU2hhcmUgPiAuMDEsIFBhcnR5XQpjX3BhcnR5X2NvbG9ycyA8LSBjKCJkb2RnZXJibHVlIiwgImdyZWVuMyIsICJibGFjayIsICJ5ZWxsb3ciLCAibGlnaHRibHVlIiwgImRhcmtncmVlbiIsICJkYXJrZ3JleSIpCgojIFN1bSBieSBwYXJ0eSBieSBjb3VudHkuCmNfbCA8LSBjX2xbLCBDb3VudHk6PWdzdWIoIijnrKxbMC05XSspP+mBuOiIieWNgCIsICIiLCBCeSldCmNfcGFydHlfY291bnR5IDwtIGNvcHkoY19sKQpjX3BhcnR5X2NvdW50eSA8LSBjX3BhcnR5X2NvdW50eVshUGFydHkgJWluJSBjX3RvcF9wYXJ0eSwgUGFydHk6PSLlhbbku5YiXQpjX3BhcnR5X2NvdW50eSA8LSBjX3BhcnR5X2NvdW50eVssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oQ291bnR5LCBQYXJ0eSldCmNfcGFydHlfY291bnR5IDwtIGNfcGFydHlfY291bnR5WywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihDb3VudHkpXQpjX3BhcnR5X2NvdW50eVssIFBhcnR5Oj1mYWN0b3IoUGFydHksIGxldmVsPWMoY190b3BfcGFydHksICLlhbbku5YiKSldCgojIE9yZGVyIGNvdW50eSBieSB0b3RhbCB2b3Rlcy4KY291bnR5X3ZfY250IDwtIGNfbFssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oQ291bnR5KV0Kc2V0b3JkZXIoY291bnR5X3ZfY250LCAtVm90ZXMpCmNfcGFydHlfY291bnR5IDwtIGNfcGFydHlfY291bnR5WywgQ291bnR5Oj1mYWN0b3IoQ291bnR5LCBjb3VudHlfdl9jbnQkQ291bnR5KV0KCiMgQ29tcHV0ZSBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzLgpjX3BhcnR5X2NvdW50eV9nYiA8LSBjX3BhcnR5X2NvdW50eVtQYXJ0eSAlaW4lIGMoIuawkeS4u+mAsuatpem7qCIsICLkuK3lnIvlnIvmsJHpu6giKV0Kc2V0b3JkZXIoY19wYXJ0eV9jb3VudHlfZ2IsIENvdW50eSwgUGFydHkpCiMgTm90ZSB0aGF0IERQUCBoYXMgbm8gY2FuZGlkYXRlIGZvciAxIGNvdW50eS4gV2UgY291bnQgdGhlIHNoYXJlIGFzIDAuCmNfcGFydHlfY291bnR5X2diX2RpZmYgPC0gY19wYXJ0eV9jb3VudHlfZ2JbCiAgLCAuKFNoYXJlX0RpZmY9aWZlbHNlKGlzLm5hKFNoYXJlWzJdKSwgMCwgU2hhcmVbMl0pIC0gU2hhcmVbMV0pLCBieT0uKENvdW50eSldCmNfcGFydHlfY291bnR5X2diX2RpZmYgPC0gY19wYXJ0eV9jb3VudHlfZ2JfZGlmZlssIGRwcF93aW46PVNoYXJlX0RpZmYgPiAwXQpgYGAKCldlIHBsb3QgYWxsIHBhcnRpZXMgd2l0aCBtb3JlIHRoYW4gMSUgdm90ZSBzaGFyZSBieSBjb3VudHk6CgpgYGB7ciBjb25zdGl0dWVuY3lfcGFydHlfY291bnR5LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTguMzMsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gQ29uc3RpdHVlbmN5IFNoYXJlcyBieSBQYXJ0eSBieSBDb3VudHkifQpnZ3Bsb3QoY19wYXJ0eV9jb3VudHksIGFlcyh4PXJlb3JkZXIoUGFydHksIFZvdGVzKSwgeT1TaGFyZSwgZmlsbD1QYXJ0eSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIsIHdpZHRoPS43NSkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSwKICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCBzaXplPTMsIGhqdXN0PS0uMSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxKSwgYnJlYWtzPXNlcSgwLCAxLCAuMikpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLmlL/pu6giLCB2YWx1ZXM9Y19wYXJ0eV9jb2xvcnMpICsKICBsYWJzKHg9IuaUv+m7qCIsIHk9IuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+WIhuWNgOeri+WnlOWQhOe4o+W4guaUv+m7qOW+l+elqOeOhyIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBmYWNldF93cmFwKENvdW50eSB+IC4sIG5jb2w9NSkKYGBgCgpBbHNvIGV4YW1pbmUgdGhlIERQUC1LTVQgZGlmZmVyZW5jZSBmb3IgY29uc3RpdHVlbmN5IHZvdGVzIGJ5IGNvdW50eToKCmBgYHtyIGNvbnN0aXR1ZW5jeV9kcHBfa210X2RpZmYsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gQ29uc3RpdHVlbmN5IERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZSBieSBDb3VudHkifQpwIDwtIGdncGxvdChjX3BhcnR5X2NvdW50eV9nYl9kaWZmLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgU2hhcmVfRGlmZiksIGZpbGw9ZHBwX3dpbiwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRvZGdlcmJsdWUiLCAiZ3JlZW4zIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lvpfnpajnjoflt67mjpLluo/vvIkiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPliIbljYDnq4vlp5TlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgVGFpY2h1bmcgM3JkIERpc3RyaWN0IOWPsOS4reW4guesrOS4iemBuOWNgAoKYGBge3IgcHJvY2Vzc190YWljaHVuZ18zLCByZXN1bHRzPSJoaWRlIn0KIyBDb25zb2xpZGF0ZSBib3RoIHBhcnR5LWxpc3QgYW5kIGNvbnN0aXR1ZW5jeSByZXN1bHRzIGZvciBUYWljaHVuZyBkaXN0cmljdCAzLgp0YzMgPC0gY19sW0J5ID09ICLoh7rkuK3luILnrKwz6YG46IiJ5Y2AIl0KdGMzIDwtIHRjM1ssIENfU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKV0KCiMgQ29tcHV0ZSBwYXJ0eS1saXN0IHZvdGUgc2hhcmVzIGJ5IHBvbGxpbmcgcGxhY2UuCnRjM19wbCA8LSBwYXJ0eWxpc3RfbFtCeSA9PSB0YzMkQ291bnR5WzFdICYgUmVnaW9uICVpbiUgdGMzJFJlZ2lvbl0KdGMzX3BsIDwtIHRjM19wbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oUGxhY2UpXQp0YzNfY2FuZGlkYXRlcyA8LSBjKCIoMykg5rSq5oWI5bq4IOeEoSIsICIoNCkg5by1552/5YCJIOWPsOeBo+awkeecvum7qCIsICIoNikg5qWK55OK55OUIOS4reWci+Wci+awkem7qCIpCnRjM19maW5hbCA8LSBtZXJnZSh0YzNfcGwsIHRjM1tDYW5kaWRhdGUgJWluJSB0YzNfY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4oUGxhY2UsIENhbmRpZGF0ZSwgQ19TaGFyZSldLAogICAgICAgICAgICAgICAgICAgYnk9IlBsYWNlIiwgYWxsb3cuY2FydGVzaWFuPVRSVUUpCmBgYAoKYGBge3IgdGFpY2h1bmdfM19jYW5kaWRhdGVfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iVGFpY2h1bmcgM3JkIERpc3RyaWN0OiBDb25zdGl0dWVuY3kgQ2FuZGlkYXRlIFNoYXJlIn0KdGMzciA8LSB0YzNbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKENhbmRpZGF0ZSldCnRjM3IgPC0gdGMzclssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmdncGxvdCh0YzNyLCBhZXMoeD1yZW9yZGVyKENhbmRpZGF0ZSwgVm90ZXMpLCB5PVZvdGVzKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoeD0i5YCZ6YG45Lq6IiwgeT0i5b6X56Wo5pW4IiwgdGl0bGU9IuiHuuS4reW4guesrDPpgbjoiInljYDntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PXJlb3JkZXIoQ2FuZGlkYXRlLCBWb3RlcyksIHk9Vm90ZXMsCiAgICAgICAgICAgICAgICBsYWJlbD1zcHJpbnRmKCIlc1xuKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUpKSksCiAgICAgICAgICAgIHNpemU9NSwgaGp1c3Q9LS4xKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hLCBsaW1pdHM9YygwLCBtYXgodGMzciRWb3RlcykgKiAxLjIpKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKYGBge3IsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSJUYWljaHVuZyAzcmQgRGlzdHJpY3Q6IFBhcnR5LUxpc3QgU2hhcmUifQp0YzNfcGxyIDwtIHRjM19wbFssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oUGFydHkpXQp0YzNfcGxyIDwtIHRjM19wbHJbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpXQp0YzNfcGxyIDwtIHRjM19wbHJbU2hhcmUgPiAuMDFdCnNldG9yZGVyKHRjM19wbHIsIC1Wb3RlcykKdGMzX3BsciA8LSB0YzNfcGxyWywgUGFydHk6PWZhY3RvcihQYXJ0eSldCmdncGxvdCh0YzNfcGxyLCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMsIGZpbGw9UGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRhcmtvcmFuZ2UiLCAiZGFya2dyZWVuIiwgInllbGxvdyIsICJkb2RnZXJibHVlIiwgImdyZWVuIiwgImdyZWVuMyIsICJsaWdodGJsdWUiKSkgKwogIGxhYnMoeD0i5pS/6buoIiwgeT0i5b6X56Wo5pW4IiwgdGl0bGU9IuiHuuS4reW4guesrDPpgbjoiInljYDkuI3liIbljYDmlL/pu6jntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PXJlb3JkZXIoUGFydHksIFZvdGVzKSwgeT1Wb3RlcywKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzXG4oJXMpIiwgc2NhbGVzOjpjb21tYShWb3RlcyksIHNjYWxlczo6cGVyY2VudChTaGFyZSkpKSwKICAgICAgICAgICAgc2l6ZT00LCBoanVzdD0tLjEpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEsIGxpbWl0cz1jKDAsIG1heCh0YzNfcGxyJFZvdGVzKSAqIDEuMikpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3IgdGFpY2h1bmdfM19wYXJ0eWxpc3RfeF9jYW5kaWRhdGUsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTMwLCBmaWcud2lkdGg9Ni41LCBmaWcuY2FwPSJUYWljaHVuZyAzcmQgRGlzdHJpY3Q6IFBhcnR5LUxpc3QgU2hhcmUgdnMgQ29uc3RpdHVlbmN5IENhbmRpZGF0ZSBTaGFyZSJ9CmdncGxvdCh0YzNfZmluYWwsIGFlcyh4PVNoYXJlLCB5PUNfU2hhcmUpKSArCiAgZ2VvbV9wb2ludChzaXplPS41KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBsYWJzKHg9IuS4jeWIhuWNgOaUv+m7qOW+l+elqOeOhyIsIHk9Iueri+WnlOWAmemBuOS6uuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0i6Ie65Lit5biC56ysM+mBuOiIieWNgOS4jeWIhuWNgOaUv+m7qOW+l+elqOeOh++8uOWAmemBuOS6uuW+l+elqOeOhyIpICsKICBmYWNldF93cmFwKFBhcnR5IH4gQ2FuZGlkYXRlLCBuY29sPTMsIHNjYWxlcz0iZnJlZSIpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMgUmVmZXJlbmNlcyBvbiBSIFBhY2thZ2VzCgo=